const物件和const函式

2021-05-26 18:21:58 字數 2339 閱讀 5651

當乙個類的函式的參數列不同時,能過載函式,

當函式的const性不同時,也能過載函式。

如下所示:

#include "a.h"//定義了ca類

class cbigclass

const ca& getvalue() const

ca& getvalue()

private:

ca m_value;

} //客戶端**如下:

ca ca;

cbigclass bc1(ca);

ca &value1 = bc1.getvalue(); //呼叫非const版本的getvalue

const cbigclass bc2(ca);

const ca &value2 = bc2.getvalue(); //呼叫const版本的getvalue

都沒有問題。(哇,不會這個你也看不懂吧,如果真的不懂,建議你看看其他相關的帖子)

但我們要接著問,為什麼當const性不同時,也能過載函式呢?

是不是又是乙個例外和後門?

答案是: 不是。

為什麼呢?

提示一下,編譯器會自動給每乙個函式加乙個什麼引數呢?

對了,就是this指標。

在乙個類的函式後面加上const後,就表明這個函式是不能改變類的成員變數的(加了mutable修飾的除外)。

實際上,也就是對這個附件上的this指標加上了const修飾。

這樣一來,函式的參數列就不一樣了,每乙個cbigclass的物件都會呼叫正確版本的getvalue函式。

那麼,如果缺少某個版本的getvalue時會怎麼樣呢?

有了前面的理論基礎,結論就很明顯了。

1. 如果缺少非const版本的getvalue函式,

**如下:

#include "a.h"//定義了ca類

class cbigclass

const ca& getvalue() const

private:

ca m_value;

} //客戶端**如下:

ca ca;

const cbigclass bc2(ca);

const ca &value2 = bc2.getvalue(); //ok!呼叫const版本的getvalue

cbigclass bc1(ca);

const ca &value1 = bc1.getvalue(); //??為什麼也呼叫const版本的getvalue?

咦,為什麼非const的物件bc2也會呼叫const版本的getvalue呢?

哦,這是因為在沒有對應的const版本函式時,編譯器會把非const物件的this指標轉化為const的指標。

int *p1 = null ;

const int *p2 = p1; //ok,沒有問題

哈哈,是不是有點意思了,還有更有意思的在後面。

2. 如果缺少const版本的getvalue函式

**如下:

#include "a.h"//定義了ca類

class cbigclass

ca& getvalue()

private:

ca m_value;

} //客戶端**如下:

ca ca;

cbigclass bc1(ca);

ca &value1 = bc1.getvalue(); //ok!呼叫非const版本的getvalue?

const cbigclass bc2(ca);

const ca &value2 = bc2.getvalue(); //哈哈,編譯錯誤,

//cannot convert 'this' pointer from 'const class cbigclass' to 'class cbigclass &'

看見了沒有,其實就是這麼回事。

再簡單一點如下:

const int *p1 = null ;

int *p2 = p1; //編譯錯誤,同理:cannot convert from 'const int *' to 'int *'

也就是編譯器會企圖把const的bc2的this指標傳給非const型的、附加上去的this引數,

當然會編譯通不過了。

說白了,就是: 非const 型的指標能給const的指標

而const 型的指標不能給非const型的指標。

這個大家當然都知道,也能理解。

因為 加上乙個const不會 有什麼惡劣的後果,

而隨便 去掉乙個const性,也就不一樣了。

this指標?const函式?const物件成員?

includeusing namespace std class coordinate coordinate void setnum int x coordinate void setnum int x const cout yes 答案是可以的,我感覺這是因為這是一種許可權大到許可權小的改變 也就...

C 中const成員函式和const物件

一 c 中函式和物件 1.const資料成員 跟const常量一樣,只是乙個在類裡 而且是在建構函式裡 乙個在類外而已,都必須初始化。2.const成員函式 即普通成員函式後再加const。它可以讀取資料成員的值,但不能修改它們。若要修改 時,資料成員前必須加mutable。以指定其可被任意更改。m...

const物件與const成員函式

const物件只能呼叫const成員函式 includeusing namespace std class a public void fun const cout const 成員函式 但是如果把第以1個fun注釋掉就會出錯 error c2662 a fun 不能將 this 指標從 const...