const 的一些知識

2021-06-03 20:35:30 字數 2058 閱讀 5332

收集了別人關於 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呼叫了...