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

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

為什么引用在C ++中不可重定位

為什么引用在C ++中不可重定位

C++
Cats萌萌 2019-11-11 13:15:24
C ++引用具有兩個屬性:他們總是指向同一個對象。它們不能為0。指針相反:它們可以指向不同的對象。它們可以是0。為什么在C ++中沒有“不可為空的,可重定位的引用或指針”?我想不出為什么引用不可重新引用的充分理由。編輯: 問題經常出現,因為當我要確?!瓣P聯”(在這里避免使用“引用”或“指針”一詞)永遠不會無效時,我通常會使用引用。我認為我從來沒有想過“太棒了,這個引用總是指向同一個對象”。如果引用是可重新定位的,則仍然可以得到如下所示的當前行為:int i = 3;int& const j = i;這已經是合法的C ++,但毫無意義。我這樣重申我的問題: “'引用是對象'設計的背后原理是什么?為什么認為引用始終是同一個對象而不是僅在聲明為const時有用?”干杯,菲利克斯
查看完整描述

3 回答

?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

Stroustrup的“ C ++的設計和演進”中給出了C ++不允許您重新綁定引用的原因:

初始化后無法更改引用所指的內容。也就是說,一旦初始化了C ++引用,以后就不能再引用另一個對象了;它不能重新綁定。我過去曾被Algol68引用所困擾,在其中r1=r2可以通過分配給所引用r1的對象,也可以根據的類型為r1(重新綁定r1)分配新的引用值r2。我想避免在C ++中出現此類問題。


查看完整回答
反對 回復 2019-11-11
?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

在C ++中,通常說“引用對象”。從某種意義上說是正確的:盡管在編譯源代碼時將引用作為指針處理,但是引用旨在表示調用函數時未復制的對象。由于引用不能直接尋址(例如,引用沒有地址,并且返回對象的地址),因此在語義上重新分配它們是沒有意義的。而且,C ++已經具有指針,用于處理重新設置的語義。


查看完整回答
反對 回復 2019-11-11
?
慕尼黑的夜晚無繁華

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

因為那樣您就不會有不能為0的可重定位類型。除非您提供了3種引用/指針類型。哪一種只會使語言復雜化而得不到什么收益(然后為什么也不要添加第4種類型呢?非可重復引用可以為0?)


一個更好的問題可能是,為什么您希望引用可以重新定位?如果確實如此,那將使它們在許多情況下不那么有用。這將使編譯器更難進行別名分析。


似乎Java或C#中的引用可重新訪問的主要原因是因為它們完成了指針的工作。他們指向對象。它們不是對象的別名。


以下效果是什么?


int i = 42;

int& j = i;

j = 43;

在當今的C ++中,具有不可重復的引用,這很簡單。j是i的別名,并且i最終取值為43。


如果參考是可重新設置的,則第三行將參考j綁定到其他值。它不再是別名i,而是別名整數43(當然是無效的)。也許是一個更簡單(或至少在語法上有效)的示例:


int i = 42;

int k = 43;

int& j = i;

j = k;

具有可重新引用的參考。評估此代碼后,j將指向k。使用C ++的不可重復引用,j仍指向i,并且為i分配值43。


使引用可重新定位會更改語言的語義。該引用不再是另一個變量的別名。相反,它具有自己的賦值運算符,成為一種單獨的值類型。然后,引用的最常見用法之一將是不可能的。并沒有任何回報。新獲得的引用功能已經以指針的形式存在。因此,現在我們有兩種方法可以完成相同的工作,而沒有任何方法可以完成當前C ++語言中的引用。


查看完整回答
反對 回復 2019-11-11
  • 3 回答
  • 0 關注
  • 642 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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