C++中的const 深入理解
const是C++中一個讓人非常容易誤解的特行。
它最簡單的用法是被它修飾的變數被稱為常量,一旦被初始化後就不能再被修改。但,有時const又是非常複雜,甚至讓很多的程式設計師感到“可拍”。
const的簡單用法
最簡單的用法是宣告一個常量,這是在C/C++出現之前就有的一個程式語言的特性。
宣告常量只需要在變數前新增const修飾符即可,但是在宣告的同時要進行初始化,因為常量是不能被修改的。
const int a = 10; //宣告a為常量,其值為10,不可被修改
將那些在程式編譯後就不在改變的量設為常量是非常有用的。相對於C中的#define 預處理指令,const更易於理解,並且不像#define是在編譯器處理之前對原始碼進行文字處理,const是被編譯器所支援的,因此在遇到錯誤時可以得到更多的有用資訊。
const也是可以修飾指標的,這時候就要小心了,要注意const修飾的是指標本身,還是修飾指標所指向的值。
const int *a;
int const *a;
上面聲明瞭一個指標變數a,指向一個整型常量(也就是不能通過指標a修改其指向的值,因為它指向的是一個常量,但是可以改變a的指向)。
int *const a;
這裡宣告的a是一個常量指標,指向一個整型變數(可以通過指標a修改其指向整型的值,但是不能將指標重新指向其他的變數)。
int const * const a;
a是一個常量指標,指向一個整型常量。
const是左結合的,也就是會修飾它左邊,當它左邊沒有沒有可修飾的時候它修飾就是它右邊的。
const修飾函式的返回值
當一個指標或者引用指向的是一個常量時這在某些情形下是非常有用的,特別函式是作為函式的返回型別時是很有作用的。既可以享受到指標或者引用傳值的便利性又不用擔心通過指標或者引用修改具體的值。
例如
char* f(){
return "some text";
}
假如沒有const的修飾,可以又下面的程式碼
f()[0] = 'h';
這在某些情況下可能導致程式出現錯誤,但是如果使用了const修飾
const char* f(){
}
在通過返回的指標修改其指向的值就會到的編譯錯誤,可以避免上述情況的發生。
const修飾函式的引數
在C/C++中,通過值傳遞的只是實參的一個copy,在函式中做的任何修改都不會影響到實參。通過指標或者引用傳遞的引數卻可以在函式中修改其具體的值,但是這又引發了一個問題,有些值使用指標或者引用傳遞的消耗比較低(例如,結構體或者類作為函式引數時,使用指標或者引用傳遞就省掉了copy的過程)所以要使用指標或者引用來傳遞引數,但是卻不希望在函式體內通過指標(或者引用)修改傳遞過去的值,這時候就可以使用const修飾引數。
void f(const string& str){
}
const修飾類成員
使用const可以修飾類的成員變數,const型別的成員變數已經初始化就不能再被修改,並且要將其放在初始化列表中初始化。
cosnt也可以修飾類的成員方法,經過其修改的方法不能改變類的狀態。
class c1{
int m;
void f() const;
}
void c1::f()const {
m += 1;
}
上述程式碼會出現編譯錯誤,因為const方法修改類中的成員變數。
結束語
公司實習有2個周了,感覺收穫確實確實很大,平常的理論學習應用到實際中還是有很大的不同。
Linux公社的RSS地址 :https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址:https://www.linuxidc.com/Linux/2019-05/158610.htm