成员函数对象类的const和非const成员函数的重载

摘要:
首先,我是个菜鸟。因此编译失败。GetPersonAddress函数是相同的。我们还知道,非常量对象可以转换为常量对象,因此非常量对象可使用const成员函数#include#includeusingspacestd;classPerson{public:Person(){}Person:mName,mAddress{}}常量字符串&GetPersonName()常量{returnmName;}conststring&GetPersonAddress()常量{returnmAddress;}string&GetPersonName(){returnmName;}string&GetPersonAddress(){returnmAddress;}private:stringName;stringAddress;};Intmain(){Persona;cout˂˂a.GetPersonName()˂˂“”˂˂a.GetPersonAddress()˂˂endl;constPersonb;cout˂˂b.GetPersonName正确的实现结果是:这里有一个想法:为什么我们要定义conststring&GetPersonName()const;Conststring和GetPersonAddress()常量。而不是字符串&GetPersonName()const;string和GetPersonAddress()常量

首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责

    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、不怕病毒,但是很害怕自己的程序;

免责声明:文章转载自《成员函数对象类的const和非const成员函数的重载》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇dapper 写查询sql 时,多条件参数操作方法zepto 基础知识(1)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

转:(WIN)S04-CH01 PCIE XDMA开发环境搭建以及环路测试

XDMAIP使用部分教程分LINUX篇和WINDOWS篇两个部分。通过实战,面向应用,提供给大家XILINXFPGAPCIE应用解决方案。本教程以MK7160FA作为样机测试。这是一款高性价比的FPGA开发板。而M_AXI_LITE挂载的BRAM是需要进行BAR空间操作,所以地址设置为0x80000000...

登陆脚本

#!' num_ count+=1其他:lock_ input(用户名)#############1##########_###!...

JWT加密解密

token2、使用https传输协议。这点是最主要的,前面3的未必能够100%保证安全)JWT由三部分组成,可以把用户名、角色等无关紧要的信息保存到Payload部分。Header:base64enc  //eyAiYWxnIjoiSFMyNTYiLCJUWVBFIjoiSldUIn0=Payload:base64enc  //用户的关键信息eyJ1c2Vy...

mac 安装git

gitconfig--globaluser.name"your_name"gitconfig--globaluser.email"your_email@gmail.com"配置信息可以更改,以后想要更改使用上面指令就可以。同时可以使用gitconfig--list指令查看Git的配置信息。gitconfigcore.ignorecasefalse生成密钥Gi...

错误1053:服务没有及时响应启动或控制请求

服务启动时报错“错误1053:服务没有及时响应启动或控制请求:”,如下图,这种问题通常是由于不正确的超时设置导致的,请看如下解决方案,单击开始,单击运行,键入regedit,然后单击“确定”。要做到这一点,请按照下列步骤操作:1)在编辑菜单上,指向”新建”,然后单击DWORD值。2)键入ServicesPipeTimeout,然后按ENTER键。3)右键单击...

deb包制作

简介deb编包的本质是:将编译过程自动化,并生成可执行程序,使得可以通过apt-get中安装。DEB源码介绍DEB包的源码是由:程序源码+debian目录构成,其中debian目录中存放着打包成DEB文件所需的全部文件。通过debian目录中的文件可以定制软件包的行为。修改rules如果要安装二进制等文件,则需要覆写rules-˃dh_installvimd...