類的const和非const成員函數的重載

來源:互聯網
上載者:User

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;  }  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.