1. 程式人生 > >C++的引用與常量

C++的引用與常量

引用的本質

之前一直搞不清楚引用是什麼,引用其本質就是 (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;

以上只是大概的示例,僅供參考。