const和引用修飾變數和函式的總結

2021-08-17 08:25:15 字數 2450 閱讀 4603

const

int a = 5; //在編譯的時候進行初始化,即類似於#define,進行全文替換

const

int b = size(); //在執行的時候初始化

int n =7;

const

int c = n; //在執行的時候初始化

const

int i1 = 1024;

const

int &ci1 = i1;

int i2 = 2048;

const

int &ci2 = i2; //允許將const int&繫結到乙個普通int上,其實常量引用可以用任何值進行初始化

int i = 1024;

const

int &ri = i*2;

const

int tmp = i*2;

const

int &ri = tmp;

int i=0;

int *const r3 = &i;

const

int r1 = i;

const

int *r4 = &i;

const

int &r5 = i;

,即int* r6 = r4會報錯。 

注意下面乙個問題

const

int m = 0; //m本身是const型別的值

const

int* m2 = &m; //所以&m是乙個const int*型別的,即常量取位址得到的是乙個底層const

int* const m3 = &m; //所以第二行沒有錯,第三行會報錯:

const

int i = 0; //i是底層const

int &i2 = i; //報錯,因為i2不是底層const

第二個報的錯誤就是將 「int &」 型別的引用繫結到 「const int」 型別的初始值設定項時,限定符被丟棄.

// 可以將const看成是一種責任,如果乙個指標是const int*,則它有這個責任保證任何情況下不能通過它修改資料(直接或者間接的),上面的做法就是一種間接的做法,所以不合法。只有對方也同樣有這個責任感的時候才可以賦值,即底層賦值給底層const. 同理如果const int** cp = int** cp也是非法的,為什麼因為可以間接的修改最終的int資料--> *cp的值是乙個沒有const責任的指標,所以這種做法也是非法的。

string s1 = "hello ";

string s2 = "world!";

s1+s2 = "wow!";

string("adfasdf") = "123"; //注意此時一定要加string,因為c++對於常量字串是用const char*陣列儲存的// char* = "123";// *char = '9'; // error: because they point to the same area which is readonly.

string &operator=(const string&)

而=運算子可以作為乙個函式進行呼叫,而對物件的函式進行呼叫時是不在乎其是左值還是右值,如(s1+s2).size()肯定是可以執行的,所以上面的那個=號也是可以執行的。

還有一點需要注意就是=號返回的是乙個左值,所以如果對於連等的情況a1 = a2 = a3,其從右向左一次呼叫=號,等價於a1 = (a2 = a3),而此時呼叫的是=是複製運算子,而不是移動複製運演算法符,因為返回的是左值。 

所以本質上來說,因為函式只能限制傳入的引數型別,和返回的型別,並不能限制this本身的型別導致的。

雖然string這個類為了像前相容,上述寫法還是可以用的,但是對於我們自己寫的物件來說可以避免這種情況了。跟const類似,引用限定符是加在引數列表之後的:

foo &foo::operator=(const foo&) &;         //this此時只能是可修改的左值

foo &foo::operator=(const foo&) &&; //this此時只能是右值

乙個函式可以右const和&同時修飾,但是此時const必須加在&之前

常量物件只能呼叫其中的常量函式

const修飾物件和成員函式

用作自己對於const部分用法的記錄 詳情基本都寫在 注釋裡 const修飾成員函式 class myclass void fun const void funct const void func private int n void myclass fun const void myclass f...

臨時變數 引用引數和const

好久沒更了,紀念我的日語n5上冊書學成,更一篇博文。甚是開心!在現代c 中,僅當引數為const引用時,如果實參與引用引數不匹配,c 將生成臨時變數。詳細說來生成臨時變數有兩種情況 實參的型別正確,但不是左值實參的型別不正確,但可以轉換為正確的型別 ps1.左值引數是可被引用的資料物件,例如變數 陣...

const修飾指標和引用的用法 轉貼

const修飾指標和引用的用法,對於初學c 的人直是諱莫如深,不知所云.一旦你了解了其用法,一切便不值一哂了.下面我為讀者一一釋疑 大致說來其可分為三種情況 const修飾指標,const修飾引用,const修飾指標的引用.1.const修飾指標 const修飾指標又可分為三種情況 const修飾指...