首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责
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、不怕病毒,但是很害怕自己的程序;