C++的引用與常量
阿新 • • 發佈:2018-12-30
引用的本質
之前一直搞不清楚引用是什麼,引用其本質就是 (int* const),如下一個簡單的引用方式:
int a = 10;
int& b = a;
其實在編譯時,編譯器會將“ int& b = a ” 變為 “ int* const b = &a ”;
由於int* const 所修飾的變數必須要賦初值,且由於const 修飾的 b ,所以表示b指標是無法修改的,即b指標無法指向另一個指標,所以這也驗證了引用必須賦初值的原因。
附:關於如何引用陣列
//方法1 -- 比較好理解,把陣列定義為一種型別,直接用(int& b = a)的方式進行 typedef int arr_ref[10]; int arr[10]; arr_ref& ref = arr; //方法2 -- 比較方便 int arr[10]; int (&ref)[10] = arr;
常量的一些問題
一、關於 int* const a 和 const int* a 的區別,雖然很基礎的問題,但是對於初學者來說實在頭疼。
int* const a ,是const 修飾 a,所以a指標不可變,也可以把簡單的把它看成引用,即和引用一樣。指標不能改變,而所指的內容卻是可以變的。如下:
int a = 10; int& b = a; b = 11; int d = 20; int* const c = &d; //這裡其實和int &c = d ;一樣,只是表達方式若有不同 *c = 12; cout << " b = " << b << " , c = " << *c << endl;
得到的結果為。
同樣的const int * a 則是 const 修飾的是int* a,即 a 所指的內容不可變,但是 a 的指標卻是可以變的,如下:
int a = 10; int* const c = &a ;//c不能改變,即指標不能變; *c = 11; const int* d = &a;//d值不能變 指標可變 (直接與int* const c 做對比) int b = 12; d = &b; cout << *c << endl; cout << *d << endl;
得到的結果為。
二、const修飾的資料也是可以改變的
如下 const 的資料仍是可以改變的:
int b = 10; //此時 b 已經在堆疊中佔有一塊區域,而不是常量池
const int a = b;
int* p = (int*) a; //通過指標就可直接更改內容
(*p)++;
同理,用這種方式修飾的類或結構體,仍是可以修改內容。
struct pa{
int a;
}
const pa p; //在堆疊中建立了一塊區域,而不是常量池
//p.a = 50; //由於const 修飾 a 是不可直接修改
pa* p = (pa*)&p; //指標間接修改
p->a = 100;
以上只是大概的示例,僅供參考。