簡體   English   中英

在所有情況下更喜歡C ++引用指針是否真的是最佳做法?

[英]Is it really the best practice to prefer C++ references to pointers in all situations?

C ++ FAQ說:

“盡可能使用引用,並在必要時使用引用。”

我覺得它不像上面說的那么容易。 已經很好地討論了引用通常對指針更好的原因。 所以我寧願討論特殊情況,其中引用有意義,但非常不尋常,只是感覺不對:

對我來說,最明顯的情況是它們在一般數據結構(如樹或鏈表)中的使用。 他們的接口當然可以使用引用來實現並且感覺更安全,但是我還沒有看到可以利用引用的單個實現,例如:

Node *parent = n.parent(); // parent might be unset -> pointer
Node &child = n.child(5); // child is always valid -> reference

雖然它看起來很有吸引力,但它會導致代碼如下:

if(parent == &child) ... //  weird, unusual at least?

我想知道,這是什么代表純C ++?

每當我試圖在任何可能的地方盲目地使用引用時,我都會遇到各種類似的不一致,並最終以各種丑陋的方式混合指針和引用

總而言之,為什么operator new不首先返回對新實例的引用而不是指針? (並在出現錯誤時拋出):

Node &n = new Node;
delete &n;

這是一個荒謬的例子,但這不是“純粹的C ++”嗎?

初始化后,無法修改引用以引用其他對象。 但是可以修改指針以在運行時引用不同的對象。

一般的經驗法則

每當您希望變量在其生命周期內指向不同的對象時,請使用指針。

如果您只想將變量用作另一個變量的別名,請使用引用。

作為參數

我們有時將參數作為引用傳遞(const / non-const)。 每次調用函數時,這都有助於避免復制整個對象。 因此,當傳遞大尺寸的物體時,這將是非常有意義的。

如果函數需要接收一些參數而不是可選的null,則可以使用指針。 但是,同樣,您可以始終為任何類定義靜態null對象,並且可以使用它。

作為返回值

每當我們重載諸如[]或<<之類的運算符時,我們都會返回引用。 這是因為,如果我說,vec [0] = 10,它實際上應該將值10分配給vec中的位置0。 由於顯而易見的原因,我不能不使用指針。 * vec [0] = 10不會看起來不錯。 此外,您應該保證,當您返回引用時,它總是引用一個對象(它永遠不應該為null)。

同樣,當函數可以返回NULL值時,使用指針,否則您可能必須為該類聲明一個靜態null對象。

作為數據成員

引用應該在構造函數中初始化。 因此,一旦構造了對象,就不能改變它們。

因此,如果您需要一個在類的生命周期中需要指向不同對象的變量,那么指針將是一個不錯的選擇。

我認為通用數據結構屬於“必要時使用指針”子句。 也就是說,由於引用是常量(即它們總是引用同一個對象),因此使用鏈接列表或樹節點結構中的引用將意味着您無法插入新節點或從數據結構中刪除舊節點 - 通常會失敗目的。

正如有人在評論中所說,我認為這個建議確實適用於函數參數。 傳遞引用而不是指針避免了必須為每個函數添加空指針處理邏輯,這在代碼大小和清晰度方面帶來了許多好處。

如果您熟悉關系數據庫中的NULL和NOT NULL列,或者XSD中的必需元素和可選元素之間的差異,您可以從這樣的域中繪制一個有用的並行來指導您。

引用將代表固定,獨立且不可為空的變量。 對於那些有真正需要的人來說,指針有時會傳遞“沒有價值”,或者你明確需要執行指針運算(例如使用數組)。 這些並不是唯一的區別,但大多數不同的語法都是從那里開始的。

回顧一下:reference = NOT NULL和只讀。 指針=靈活且有點危險。

“new”運算符分配內存(就像C中的malloc一樣)。 由於C ++沒有實現垃圾收集器(如Java或C#),因此內存不足。 因此,當新的無法分配內存時返回NULL值。 這樣您就可以測試分配是否成功。

您不能對new運算符使用引用,因為可能會因缺少內存而分配NULL值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM