成员函数对象类的const和非const成员函数的重载
首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责
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; }
文章结束给大家分享下程序员的一些笑话语录:
系统程序员
1、头皮经常发麻,在看见一个蓝色屏幕的时候比较明显,在屏幕上什幺都看不见的时候尤其明显;
2、乘电梯的时候总担心死机,并且在墙上找reset键;
3、指甲特别长,因为按F7到F12比较省力;
4、只要手里有东西,就不停地按,以为是Alt-F、S;
5、机箱从来不上盖子,以便判断硬盘是否在转;
6、经常莫名其妙地跟踪别人,手里不停按F10;
7、所有的接口都插上了硬盘,因此觉得26个字母不够;
8、一有空就念叨“下辈子不做程序员了”;
9、总是觉得9号以后是a号;
10、不怕病毒,但是很害怕自己的程序;