C++ 引用、指針、const
引用
- 引用就是對象的一個別名,常用作函數的形式參數。通過在變量名前加“&”來定義。不能定義引用類型的引用,什麼是引用類型的引用?
int a = 10;
int& b = a;
int& c = b;
//上面代碼可以編譯通過,且可運行,c的值也爲10
int&& d = c; //編譯不通過,這是引用類型的引用,就如int** p是指針的指針同理
- 引用是別名
因爲引用只是所綁定對象的一個別名,所以對引用所作的操作都會作用到它所綁定的對象上。引用必須用於該引用同類型的對象初始化
int i = 1024;
int& ref1; //error:未初始化
int& ref2 = 100; //error:初始化必須爲一個同類型的對象
int& ref3 = i; //ok
引用與指針區別
- 相同點
指針和引用都是地址的概念,指針指向一塊內存,它的值是這塊內存的地址;引用是某塊內存的別名。
區別
- 引用是個別名,指針是個實體
- 指針可以爲空,引用不能爲空
- 引用使用時不需要解引號(*),而指針需要
- 引用只能在定義時初始化一次,之後不能改變,指針可以改變指向的對象
- “sizeof引用”得到的是所綁定對象的大小,而“sizeof指針”得到的是指針本身的大小
- 引用和指針的自增運算符(++)意義不一樣
引用與指針不難區別,當引用和指針加上const就懵了,看看它們之間的用法吧。
const與引用,指針
const用法
- const用法主要是防止定義的對象再次被修改,把修飾的對象轉變爲了一個常量,定義const類型的變量時要初始化。
const int size = 1024; //定義size爲常量並初始化爲1024,變量size仍然是一個左值,但是是一個不可修改的左值
size = 10; //error:不可修改const修飾的對象
- const對象默認爲文件的局部變量
在全局作用域聲明的const變量是定義在該對象的文件的局部變量,此變量只存在於那個文件中,不能被其它文件訪問。通過制定const變量爲extern,就可在整個程序中訪問const對象。
//file1.cpp
extern const int buf = 512;
//file2.cpp
extern const int buf; //file1.cpp中buf必須顯式地加上extern才能編譯通過並使用
const與引用
- const引用
const引用是指向const對象的引用
const int val = 1024;
int& ref1 = val; //error:非const引用綁定一個const對象是非法的
const int& ref2 = val; //ok
//上面代碼中ref2不能修改了,任何對ref2的賦值操作都是非法的
const引用可以初始化爲不同類型的對象或者初始化爲右值
int i = 10;
const int& ref = 20;
const int& ref2 = ref+i;
//編譯通過
const與指針
- 指向const對象的指針
我們可以使用指針來修改所指對象的值,但是如果指針指向的是const對象,我們就不能讓指針來修改所指對象的值,c++強制要求指向const對象的指針必須具有const特性。
const int* cptr;
//cptr是一個指向int類型const對象的指針,const限定了cptr指針所指向的對象的類型,而非cptr指針本身。即cptr並不是const。在定義時也就不需要對cptr進行初始化,如果需要,cptr可以改變指向其它 const int型的變量。但不能通過cptr改變所指對象的值
*cptr = 20; //error:不能修改cptr所指對象的值
允許把非const對象的地址賦給指向const對象的指針
int val = 2;
const int* ref = &val; //ok,儘管val不是const對象,但是任何想通過ref修改其值的香味都會編譯錯誤
//但是val不是const對象,所有有可能被其它方式修改值,只是ref不能修改val的值
- const指針
指針本身的值不能修改,即不能改變指針指向其它對象,任何給指針賦值的行爲都會編譯錯誤,const指針也必須在定義時初始化。指向const對象的const指針
const int* const ptr = &a; //既不能修改所指對象的值,也不允許修改指針指向