1. 類的const成員函數與非const成員函數的重載
#include <iostream>#include <string>using namespace std;class Person{public:Person() {}Person(string name, string address) : mName(name), mAddress(address){}string& GetPersonName(){return mName;}string& GetPersonAddress(){return mAddress;}private:string mName;string mAddress;};int main(){Person a("zhangguanghui", "hebei Province");cout << a.GetPersonName() << " " << a.GetPersonAddress() << endl;const Person b("zhangjingru", "shanxi Province");cout << b.GetPersonName() << " " << b.GetPersonAddress() << endl;return 0;}
輸出結果是:
該檔案不能通過編譯,給出的錯誤時:
1>d:\visual c++\c++primer\第12章\12_1\12_1\person.cpp(33) : error C2662: “Person::GetPersonName”: 不能將“this”指標從“const Person”轉換為“Person &”
1>d:\visual c++\c++primer\第12章\12_1\12_1\person.cpp(33) : error C2662: “Person::GetPersonAddress”: 不能將“this”指標從“const Person”轉換為“Person &”
我們知道每個類的成員函數都會隱含得插入一個this指標,則一個非const成員函數插入的隱含this指標是Person &,
每一個const成員函數插入的隱含this指標是const Person &.
因此GetPersonName是一個非const成員函數,故插入的this指標是Person &,然而const Person b對象是一個const對象,所以在使用b調用GetPersName時
需要將const Person 轉換成Person &,我們知道將const對象轉換成非const對象是不合法的。所以編譯沒有通過。 同理GetPersonAddress函數也一樣。
我們還知道可以將一個非const對象轉換成一個const對象,所以一個非const對象可以調用const成員函數。
修改正確代碼為:
#include <iostream>#include <string>using namespace std;class Person{public:Person() {}Person(string name, string address) : mName(name), mAddress(address){}const string& GetPersonName() const{return mName;}const string& GetPersonAddress() const{return mAddress;}string& GetPersonName(){return mName;}string& GetPersonAddress(){return mAddress;}private:string mName;string mAddress;};int main(){Person a("zhangguanghui", "hebei Province");cout << a.GetPersonName() << " " << a.GetPersonAddress() << endl;const Person b("xiaozhang", "shanxi Province");cout << b.GetPersonName() << " " << b.GetPersonAddress() << endl;return 0;}
正確執行結果是:
這裡有一個思考:為什麼我們要定義 const string& GetPersonName() const; const string& GetPersonAddress() const.
而不是string& GetPersonName() const; string& GetPersonAddress() const。
這是一篇文章,可以讀一讀:http://blog.csdn.net/anjy/article/details/1819126
從上面例子我們得出: const對象只能調用const成員函數,非const對象可以調用非const成員函數,也可以調用const成員函數,其中非const成員函數優先。
2. 下面是一個微軟2013年實習生招聘筆試的一個題目:
#include <iostream>using namespace std;class A { public: virtual void f() { cout<<"A::f"<<endl; } void f() const { cout<<"A::f const"<<endl; }}; class B:public A { public: virtual void f() { cout<<"B::f"<<endl; } void f() const { cout<<"B::f const"<<endl; } }; void g(const A* a) { a->f(); } int main() { A *b = new B(); b->f(); g(b); return 0; }