[英]C++ Difference Between Const Reference to Non Const Object and Non Const Reference to Non Const Object
如果引用的對象不是 const 對象,“const”關鍵字用於引用的目的是什么? r1 和 r2 的作用(如下)有什么區別嗎?
int i = 42; // non const object
const int &r1 = i; // const reference to non const object
int j = 25; // non const object
int &r2 = j; // non const reference to non const object
這是 CPP Primer 5th 的引述:
“C++ 程序員傾向於將短語“const 引用”縮寫為“const 引用”。 這個縮寫是有道理的——如果你記得它是一個縮寫。從技術上講,沒有const引用。引用不是一個對象,所以我們不能把引用本身設為const。確實,因為沒有辦法創建引用引用不同的對象,從某種意義上說,所有引用都是常量。引用是引用常量類型還是非常量類型會影響我們可以用該引用做什么,而不是我們是否可以改變引用本身的綁定。”
我認為這意味着在引用非 const 對象時將引用設為“const”絕對沒有任何作用。 我們不妨在定義該引用時去掉那個 const 關鍵字。
在這里問這個問題以求確認。
編輯:看起來我最初的猜想是錯誤的。 我現在明白對非 const 對象的 const 引用確實有一個目的:防止引用修改對象。 非 const 對象仍然可以通過其他方式修改,但不能通過此 const 引用進行修改。
謝謝大家。
為了更好地理解它,您可以查看const指針和指向const數據的指針之間的區別:
int i, j;
const int *p1 = &i; // pointer to constant int
int *const p2 = &i; // constant pointer to int
*p1 = 0; // error, p1 points to const int
*p2 = 0; // it is fine sets i to 0
p1 = &j; // fine p1 now points to anbother int
p2 = &j; // error, p2 is a constant pointer
因此,現在,如果我們替換指向引用的指針,我們將看到類似的內容,除了引用本身是不可更改的,即您不能在創建另一個對象后就引用另一個對象(與非常量指針不同),並且任何引用都類似於常量指針。 因此,這種意義上的const引用毫無意義,通常const引用是指對const類型的引用。 那引物的意思是什么。
至於代碼中的差異,是的,存在差異-您無法通過const引用更改對象,無論該引用是否指向const對象都沒有關系。
“如果引用的對象不是const對象,則引用const的目的是什么?” 目的是防止該引用被用來修改它所引用的對象。
int i = 42; // non const object
const int &r1 = i; // const reference to non const object
r1 = 6 * 9; // error, r1 cannot be used to modify i;
有一種有用的方法可以弄清楚const
在指針和引用中的含義,即從右向左讀取聲明(請參見這些答案 )。 因此const int &r1
可以理解為“ r1
是對int const
的引用”。
基本上, r1
是指無法修改的int
。 這意味着所引用的int
可以是const int
, 也可以是簡單的int
。 將const
const引用綁定到非const
對象(例如,編寫類似int i = 5; const int& r = i;
)是完全合法的,因為不修改非const
對象沒有任何錯誤。
我認為這意味着在引用非const對象時將其引用為“ const”絕對沒有任何作用。 定義引用時,我們也可以刪除const關鍵字。
不對。
您不得修改非const
通過對象const
引用。
您可以修改非const
通過非對象const
引用。
除非在程序的只讀部分中創建對象,否則該對象可以進行修改而不會產生不利影響。 但是,當您使用對非const
對象的const
引用時,您要求編譯器不允許您通過該特定引用來修改對象。 這並不意味着您不會修改對象。
它類似於函數參數。 當函數使用const
引用參數類型時,該函數向您保證不會修改該對象。 這並不意味着該對象根本不可修改。
如果我們將const與變量一起使用,則其值不能更改;當將其與const引用一起使用時,如果將其與對象一起使用,則其引用不能更改;然后在對象中使用整個數據,則不能更改。
還值得一提的是,當您將兩者都傳遞給函數調用 fun1(const int& R1) 與 fun2(int & R1) 時的行為
在 fun1 中,您可以使用成本或變量來調用它,例如 fun1(5) 或 fun1(var1); 假設 int var1=5;
在 fun2 中,你根本不能用 const 調用它,fun2(5) 會給你編譯器錯誤,這意味着在這種情況下你必須添加另一個重載實現來覆蓋這種情況。 糟糕的設計!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.