亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

何時使用引用和指針

何時使用引用和指針

C++
白板的微信 2019-06-21 16:44:22
何時使用引用和指針我理解指針與引用之間的語法和一般語義,但是我應該如何決定在API中使用引用或指針多少是合適的呢?當然,有些情況需要(operator++需要一個引用參數),但通常我發現我更喜歡使用指針(和Const指針),因為語法清楚地表明變量正在被破壞性地傳遞。例如,在以下代碼中:void add_one(int& n) { n += 1; }void add_one(int* const n) { *n += 1; }int main() {   int a = 0;   add_one(a); // Not clear that a may be modified   add_one(&a); // 'a' is clearly being passed destructively}對于指針,總是(更)明顯的是發生了什么,所以對于API之類的方面來說,清晰性是一個很大的問題,而指針并不比引用更合適?這是否意味著只有在必要時才應使用引用(例如:operator++)?是否對其中一種或另一種有任何性能上的顧慮?編輯(過時):除了允許空值和處理原始數組之外,選擇似乎可以歸結為個人偏好。我接受了下面的答案谷歌C+風格指南,因為它們提出了這樣的觀點:“引用可能會令人困惑,因為它們具有值語法,但具有指針語義?!庇捎谇謇碇羔槄邓璧念~外工作,指針參數不應為空(例如,add_one(0)將調用指針版本并在運行時中斷),從可維護性的角度來看,在必須存在對象的地方使用引用是有意義的,盡管失去語法清晰度是可恥的。
查看完整描述

3 回答

?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

在可能的地方使用引用,在必須的地方使用指針。

避免指針,直到你不能。

之所以如此,是因為指針使事物更難跟蹤/讀取,比任何其他構造都更不安全,也更危險。

因此,經驗法則是,只有在沒有其他選擇的情況下才使用指針。

例如,當函數在某些情況下返回nullptr時,返回對象的指針是一個有效的選項,并且假定它會返回。也就是說,更好的選擇是使用類似于boost::optional.

另一個例子是將指向原始內存的指針用于特定的內存操作。應該在代碼的非常狹窄的部分隱藏和本地化,以幫助限制整個代碼庫中的危險部分。

在您的示例中,使用指針作為參數是沒有意義的,因為:

  1. 如果你提供

    nullptr

    作為論點,你將進入一個不明確的-行為-土地;
  2. 引用屬性版本不允許(不容易發現技巧)1的問題。
  3. 對于用戶來說,引用屬性版本更容易理解:您必須提供一個有效的對象,而不是可能為NULL的對象。

如果函數的行為必須使用或不使用給定的對象,那么使用指針作為屬性意味著可以傳遞nullptr作為論證,這對函數來說是很好的。這是用戶和實現之間的一種契約。


查看完整回答
反對 回復 2019-06-21
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

性能完全相同,因為引用是作為指針在內部實現的。因此,你不需要擔心這一點。

關于何時使用引用和指針,沒有普遍接受的約定。在一些情況下,您必須返回或接受引用(例如,復制構造函數),但除此之外,您可以隨意執行。我遇到的一個相當常見的約定是,當參數必須引用現有對象時使用引用,當空值確定時使用指針。

一些編碼約定(如谷歌的)規定應該始終使用指針或Const引用,因為引用有一些不明確的語法:它們有引用行為,但有值語法。


查看完整回答
反對 回復 2019-06-21
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

從…C+FAQ Lite -

可以時使用引用,必要時使用指針。

當您不需要“重新處理”時,引用通常比指針更好。這通常意味著引用在類的公共接口中最有用。引用通常出現在對象的皮膚上,指針出現在內部。

上述情況的例外情況是,函數的參數或返回值需要“Sentinel”引用-一個不引用對象的引用。這通常最好是返回/接受一個指針,并賦予空指針這個特殊的意義(引用必須總是別名對象,而不是取消引用的空指針)。

注意:老C行程序員有時不喜歡引用,因為他們提供的引用語義在調用者的代碼中不明確。然而,經過一些C+經驗之后,人們很快就意識到這是一種信息隱藏形式,它是一種資產,而不是一種負債。例如,程序員應該用問題的語言而不是機器的語言來編寫代碼。


查看完整回答
反對 回復 2019-06-21
  • 3 回答
  • 0 關注
  • 409 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號