收集了別人關於 const 的一些論述。
const 的用法很多很靈活,稍不注意,就會有些莫名其妙的問題出現。
甲:用於定義乙個不能被更改的變數的時候:
const int i = 10; // i 的值不能被改變,否則報錯
void fun ( const int i ) // 在函式中,i 的值不能被改變,即使他是個區域性變數。
或
int a = 10;
int b = 90;
const int *p = &a;
//int const *p = &a;
//const在 * 前即可,
*p = 99; //報錯
a = 99; //可行
p = &b; //可行
//此時指標指向的內容具有 const 性,它所指向的位址的內容是不能通過指標改變,但是指標指向的位址是可變的。
或
int a = 10;
int b = 90;
int* const p = &a;
*p = 99; //可行
a = 99; //可行
p = &b; //報錯
//此時指標作為乙個變數,具有 const 性,這個指標變數是不能改動的,只能指向這個位址,但是位址中的內容是可變的。
或
int a = 10;
const int* const p = &a;
a = 785; //可行
*p = 15; //報錯
p = &b; //報錯
//綜合前二者,指標指向的位址,和位址中的內容都是不能變的,指標等於這個變數的乙個別名,變數的內容不能通過指標改變。
指標使用const時,如果const在* 的左側,即為指標指向常量;const在* 的右側,即為指標是常量。
函式引數表中帶const 的引數也並非絕對不能修改,比如指標型別的就可以通過把這個const指標賦值給另一指標,然後修改新建指標指向的內容,繞過const指標。到目的。
乙: 類中的const
類成員的const:
class
int get()
int get() const
};
const x x1(0,9);
x x2(0,9);
cout << x1.get() << "\t" << x2.get() << endl;
可見,x1 呼叫的是int get() const,x2 呼叫的是 int get();另外,加了const的函式,不能對類的資料成員作出更改;
另外,const的成員函式,不能呼叫非const的成員函式;
另外,用mutable關鍵字修飾過的成員變數可以在宣告為const 函式中被改變;
另外,非const物件可以呼叫const函式,而const的物件,不能呼叫非const的函式。
例如:
class x
int get()
};const x x1(8, 9);
x x2(1, 2);
cout << x1.get() << endl;
cout << x2.get() << endl;
輸出x1.get()會報錯,
對於const成員函式的解釋是,函式會獲得乙個this指標,而const成員函式,獲得的this指標是const的,本質上還是一種引數的過載,
丙:函式引數使用const
如:
void fun(const int i)
//無意義,因為本身就是形參
void fun(const int *p)
//指標指向的內容是常量,不可變
void fun(int * const p) //無意義,形參
void fun(const int &i) //引數為引用,也是為了防止改變
丁:更詳細參見
關於const的一些知識
首先來看幾個句子 1 const int a 2 int const a 3 const int a 4 int const a 5 int const a const 1和2的作用是一樣的 a是乙個整形常數。3說明a是乙個指向整形常數的指標 雖然整形常數不可修改,但指標可以修改的 4的意思是a是乙...
有關const的一些知識點
預設情況下,const只在檔案內有效。如果確實需要在檔案間共享,可以使用extern關鍵字 不管是定義或者宣告都需要新增 const作用到引用上,則該引用不能修改被引用的值。初始化對const的引用 編譯器會將上述 變成如下形式 為了確保型別一致 我們設想如果沒有const時,若是將引用繫結到乙個臨...
const 的一些理解
以前覺得自己對const還是有些理解的,今天一兄弟問了乙個問題才讓我對這個東西又加深了些了解 class temp public void output void func const temp a a.output 就這麼簡單乙個東西,眨眼一看,沒什麼問題,但是編譯是不會通過的,因為func呼叫了...