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