成员函数对象类的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、不怕病毒,但是很害怕自己的程序;

posted @ 2013-05-08 19:12  xinyuyuanm  阅读(387)  评论(0编辑  收藏  举报