簡體   English   中英

C++ 對非常量對象的常量引用和對非常量對象的非常量引用之間的區別

[英]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.

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