下午在調程序時,遇到 error: passing ‘$class_name‘ as ‘this’ argument of ‘$class_function‘ discards qualifiers的編譯的錯誤,
錯誤的意思是 this指針在作為參數傳入class_function時限定符被取消了
google一下,是這個函數需要用const修飾,而我漏了,因而報了這個編譯錯誤。
順便將const關鍵詞在C++中的使用總結一下。
const, constant的縮寫,想必大家在第一堂C/C++課程的時候,老師們都是這麼解釋的“const 就是常量的意思,可以避免減少程序中的魔數(magic number)”。其實,這是對const最大的誤解,以至於多年來大家見到const就想到在文件前幾行的定義的常變量。
const在C++中的使用歸納為
const對變量的修飾
cosnt對指針的修飾
const對函數的修飾
一. const對變量的修飾
const int MAX_SIZE = 1024;
這是最常見的用法,大家都沒問題, const在定義的時候需要初始化。
有兩點需要注意一下:
a) const變量默認是局部變量,如果需要全局訪問,需要顯示地extern
b) const int MAX_SIZE = 1024 與 #define MAX_SIZE1024 貌似做了相同的事情,但是是完全不同的兩個同意。
#define作為宏定義是完全文本替換,而const MAX_SIZE是作為一個變量整體的。
下面這段代碼可以說得更清楚:
const int MAX_SIZE = 1 << 10;// #define MAX_SIZE 1<<10
cout << MAX_SIZE << std;
二. const對指針的修飾
const int * a = &b; (1)
int const * a = &b; (2)
int * const a = &b; (3)
const int * const a = &b; (4)
(1)(2)的含義是相同的,表示指針所指的內存空間不可修改. *a = XXX;是非法的
(3)表示指針不可修改,a++是非法的;
(4)表示指針和指針內容都不可修改
三. const對函數的修飾
void fun(const int &r) (1) 與int const相同
void fun() const (2)
const int fun() (3)
(1) 函數的參數為const,表示函數不可修改參數的值
(2) 函數加const後綴, 此時的函數為自定義結構(struct,class)的成員函數,表示該函數成員不可修改class的成員變量
(3) 函數的返回結果為const
表示返回的結果不可修改,返回結果只能賦值給const修飾的變量
幾點經驗:
1)對const變量采用統一的編碼風格能減少一些不必要的錯誤
2)給函數傳參時,盡量使用帶const的引用方式
3)返回結果迫不得已才使用const修飾