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

  • 相关阅读:
    表格Table宽度设置无效的解决方法
    ajax异步模式下实现同步和等待loading效果(jQuery同步Ajax带来的UI线程阻塞问题及解决办法)
    Chrome开发者工具详解(2)-Network面板
    iframe框架加载完成后执行函数
    js获取url?号后面的参数
    绑定键盘回车事件
    js判断一个元素是否在iframe里面
    字符串一些js操作方法
    基于GIS技术的国土空间规划“一张图”实施监督信息系统SuperMap arcgis
    基于supermap 3d-webgl技术的商务楼宇信息监测系统大数据 三维
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3067426.html
Copyright © 2011-2022 走看看