當乙個類的函式的參數列不同時,能過載函式,
當函式的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...