自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么使用指針比使用對(duì)象本身更好?

開發(fā) 開發(fā)工具
事實(shí)上,指針除了用來實(shí)現(xiàn)動(dòng)態(tài)分配內(nèi)存外還有很多其它的用法,但是其中大部分也都存在比它們更好的選擇。就像前面說過的那樣,除非你必須用到指針,否則不要貿(mào)然使用。

問題:為什么使用指針比使用對(duì)象本身更好?

我是一名Java程序員,最近開始學(xué)習(xí)使用C++中的對(duì)象。有個(gè)問題我一直覺得很困惑:那就是為什么人們更喜歡使用指向?qū)ο蟮闹羔樁皇菍?duì)象本身。比如:

這樣聲明:Object *myObject = new Object;

而不是:Object myObject;

使用函數(shù)的時(shí)候也是如此,假設(shè)有個(gè)函數(shù)為testFunc(),使用時(shí)可以這樣:

myObject.testFunc();

但一般這樣調(diào)用:

myObject->testFunc();

但是我不知道為什么要這樣做,我想可能是因?yàn)槲覀冎苯釉L問了內(nèi)存地址,所以能提高效率和運(yùn)行速度。我理解的對(duì)嗎?

***答案:

很不幸,你看的很多講的都是動(dòng)態(tài)分配。這只能說明存在很多根本不精通C++的程序員。從某種意義上說,你的問題其實(shí)可以分成兩個(gè)小問題。***個(gè)是應(yīng)該何時(shí)使用動(dòng)態(tài)分配(即使用new關(guān)鍵字)?第二個(gè)問題是應(yīng)該何時(shí)使用指針?

使用合適的工具通常是做好一項(xiàng)工作的關(guān)鍵。在大部分情況下,存在比使用一般的動(dòng)態(tài)分配或者原指針更合適、更安全的方法。

動(dòng)態(tài)分配

在你的問題里,你用了兩種方式創(chuàng)建對(duì)象。這兩種方式主要的不同在于對(duì)象的存儲(chǔ)時(shí)間。當(dāng)執(zhí)行Object myObject;這句代碼時(shí),它作為自動(dòng)變量被創(chuàng)建,這意味著當(dāng)對(duì)象出了作用域時(shí)也會(huì)自動(dòng)銷毀。而當(dāng)你使用new Object()這種方式時(shí),對(duì)象所擁有的內(nèi)存是動(dòng)態(tài)分配的,這表示直到你調(diào)用delete()方法對(duì)象才會(huì)被銷毀,否則一直存在。當(dāng)需要用動(dòng)態(tài)分配內(nèi)存來處理時(shí),你應(yīng)該只使用動(dòng)態(tài)分配的方式,也就是說,當(dāng)你可以使用動(dòng)態(tài)分配內(nèi)存的時(shí)候就不要使用自動(dòng)變量。

以下是可能會(huì)使用到動(dòng)態(tài)分配的兩種常見情況:

1.當(dāng)想讓對(duì)象在出了作用域后依然存在——且確實(shí)就是之前存儲(chǔ)在該內(nèi)存中的對(duì)象,而不是對(duì)象的拷貝。如果你可以接受使用對(duì)象的拷貝或者移動(dòng)(大部分情況下你應(yīng)該這樣),那么你更應(yīng)該使用自動(dòng)存儲(chǔ)方式。

2. 當(dāng)需要大量?jī)?nèi)存時(shí),這種情況下極易導(dǎo)致棧溢出。當(dāng)然如果這對(duì)你來說根本不是問題就更好了(大部分情況下這是不可能的)。這顯然超出了C++的管轄范圍,但是不幸的是,我們必須處理我們開發(fā)的系統(tǒng)中存在的這種現(xiàn)實(shí)問題。

當(dāng)你確實(shí)需要使用動(dòng)態(tài)分配時(shí),你應(yīng)該將它封裝到一個(gè)智能指針中或者其他能具有RAII特性的類型(例如標(biāo)準(zhǔn)容器)。智能指針提供動(dòng)態(tài)分配內(nèi)存的對(duì)象的所有權(quán)語義。例如std::unique_ptr和std::shared_ptr。如果你能夠合適的使用它,你基本上不需要自己管理內(nèi)存(參見Rule of Zero這篇文章)。

指針

事實(shí)上,指針除了用來實(shí)現(xiàn)動(dòng)態(tài)分配內(nèi)存外還有很多其它的用法,但是其中大部分也都存在比它們更好的選擇。就像前面說過的那樣,除非你必須用到指針,否則不要貿(mào)然使用。

需要使用引用的情況:有的時(shí)候,你想調(diào)用的函數(shù)需要訪問你當(dāng)前的對(duì)象本身(而不是它的拷貝),那么你就需要使用指針作為參數(shù)進(jìn)行傳遞(暫不論它是如何分配的)。然而,在大部分情況下,使用引用會(huì)比指針更好,這也正是引用被設(shè)計(jì)的理由。注意一下,這里不需要像上面所說的那樣去延長(zhǎng)對(duì)象的生命周期。前面已經(jīng)說過了,如果你能接受使用對(duì)象的拷貝,那么你就沒必要再使用引用了。

需要使用多態(tài)的情況:通常你只能通過對(duì)象的指針或者引用來實(shí)現(xiàn)多態(tài)(也就是根據(jù)對(duì)象的動(dòng)態(tài)類型來調(diào)用函數(shù))。如果這就是你想要的,那么你就需要使用指針或者引用。同樣,以指針為優(yōu)先選擇。

當(dāng)對(duì)象可忽略時(shí),通過傳遞一個(gè)空指針來實(shí)現(xiàn)對(duì)象是可選的屬性:如果它是一個(gè)參數(shù)的話,你應(yīng)該優(yōu)先使用默認(rèn)參數(shù)或者函數(shù)重載的方法。否則你應(yīng)該選擇一種可以封裝這種行為的類型,例如boost::optional(或者是std::optional)。

當(dāng)你想降低文件間的編譯依存關(guān)系從而節(jié)省時(shí)間:指針的一大特點(diǎn)在于你只需要在前面聲明一下指針指向的類型(而如果要使用實(shí)際的對(duì)象,你還需要定義一下)。這樣你就能降低你的編譯單元之間的耦合性從而減少編譯時(shí)間。參考Pimpl idiom.

當(dāng)你想調(diào)用C或者類似C風(fēng)格的函數(shù)庫(kù)的接口時(shí):在這種情況下,你不得不使用指針進(jìn)行操作。你唯一能做的事情就是要保證你的指針在不使用時(shí)要被釋放。你也能通過智能指針來操作原指針,例如通過它來調(diào)用成員函數(shù)。如果被調(diào)用庫(kù)已經(jīng)為你申請(qǐng)了空間而又希望你通過句柄來釋放的話,利用智能指針封裝起句柄并利用定制的析構(gòu)器來釋放內(nèi)存無疑是一種合理的選擇。

原文鏈接: stackoverflow   翻譯: 伯樂在線 - Licorice

譯文鏈接: http://blog.jobbole.com/62873/

責(zé)任編輯:林師授 來源: 伯樂在線
相關(guān)推薦

2022-11-10 15:32:29

2012-05-11 09:50:49

iOSAndroid移動(dòng)應(yīng)用

2020-08-23 18:08:29

JavaScript命名參數(shù)位置參數(shù)

2020-02-14 13:53:33

Python 開發(fā)編程語言

2020-07-17 19:31:19

PythonR編程

2022-09-05 10:01:19

VueReact

2024-08-13 17:29:24

2020-04-07 13:40:13

GraphQLAPI編程語言

2012-09-26 10:02:44

框架開發(fā)項(xiàng)目

2017-07-03 13:33:42

AndroidItemDecorat

2010-06-17 15:53:41

WAP協(xié)議

2021-01-25 07:14:53

Cloud DevOps云計(jì)算

2011-03-08 12:59:38

proftpd

2014-11-21 10:50:26

JavaString

2021-08-31 23:33:50

AndroidiOS功能

2024-04-25 08:21:36

Java對(duì)象計(jì)數(shù)法

2022-08-08 07:33:11

虛擬存儲(chǔ)計(jì)算機(jī)系統(tǒng)物理內(nèi)存

2014-01-03 10:59:34

2020-06-23 14:09:49

枚舉JDK場(chǎng)景

2015-11-05 11:58:26

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)