zoukankan      html  css  js  c++  java
  • 成员函数对象类的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、不怕病毒,但是很害怕自己的程序;

  • 相关阅读:
    asList和subList的缺陷
    oracle和mysql的拼接查询
    Google Guava的splitter用法
    docker创建mongodb并且测试代码
    GitHub 近两万Star,无需编码,可一键生成前后端代码,这个开源项目JeecgBoot有点强
    在深圳养一个娃需要多少钱?2020深圳养娃开销(Excel文本)清单公布!家长直呼扎心了!
    Win7安装AD域管理工具-Win7安装AD域远程服务器管理工具
    盘点2020年那些大厂网盘小厂网盘其他网络存储设备
    完美解决远程计算机需要网络级别身份验证RDO
    OPPO手机的指令合集(工程模式、串号等)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3067426.html
Copyright © 2011-2022 走看看