zoukankan      html  css  js  c++  java
  • C++操作符重载 临时对象 构造函数 综合实验

    /******** 操作符重载 
    ***
    ***   下面三种方式,都支持连续加操作,但是稍有不同,你知道哪里不同吗
    ***
    ******/
     
    /** Test1
    *****/
    #if 0
    class Calculate
    {
    	int a;
    public:
    	Calculate(void) : a(0)
    	{
    		cout << "Calculate(void)" << endl;
    	}
    	Calculate(int val) : a(0)
    	{
    		a = val;
    		cout << "Calculate(int val) a = " << val << endl;
    	}
    	Calculate operator + (const Calculate& obj)
    	{
    		Calculate sum; // 无参构造
    		sum.a = this->a + obj.a;
    		cout << "Calculate operator + (const Calculate& obj)" << endl;
    		return sum;
    	}
    	int Getdata(void)
    	{
    		return a;
    	}
    };
    int main()
    {
        Calculate obj0(4);
    	Calculate obj1(3);
    	Calculate obj2(4);
    
    	Calculate obj3;
    	obj3 = obj1 + obj2;
    	cout << "obj3.Getdata() = " << obj3.Getdata() << endl << endl;
    
        cout << "--分割线--下面是第二个打印块" << endl;
    
        obj3 = obj0 + obj1 + obj2;
        cout << "obj3.Getdata() = " << obj3.Getdata() << endl;
    	while (1);  
    	return 0;
    }
    #endif
    
    /****  Test2 
     这个实验相比上面Test1,只改一处地方  ****/
    /******   请写出打印结果   *****/
    #if 1
    class Calculate
    {
        int a;
    public:
        Calculate(void) : a(0)
        {
            cout << "Calculate(void)" << endl;
        }
        Calculate(int val) : a(0)
        {
            a = val;
            cout << "Calculate(int val) a = " << val << endl;
        }
        Calculate operator + (const Calculate& obj)
        {
            Calculate sum; // 无参构造
            sum.a = this->a + obj.a;
            cout << "Calculate operator + (const Calculate& obj)" << endl;
            return sum.a; /*  相比上面那个实验相,只改这里的返回值  */
        }
        int Getdata(void)
        {
            return a;
        }
    };
    int main()
    {
        Calculate obj0(4);
        Calculate obj1(3);
        Calculate obj2(4);
    
        Calculate obj3;
        obj3 = obj1 + obj2;
        cout << "obj3.Getdata() = " << obj3.Getdata() << endl << endl;
    
        cout << "--分割线--下面是第二个打印块" << endl;
    
        obj3 = obj0 + obj1 + obj2;
        cout << "obj3.Getdata() = " << obj3.Getdata() << endl;
        while (1);
        return 0;
    }
    
    #endif
    
    /**
    实测结论:  第二个打印块内: Test2 会比Test1的多执行两个构造函数,即Calculate(int val)。
    
    原因:   Test2: obj3 = obj0 + obj1 + obj2 这句代码,先执行obj0 + obj1,会生成一个临时对象(假设称为X),其类型为返回值Calculate类型,
               同时实际返回的是int类型,这就触发了只带一个int参数的构造函数的执行。
               之后继续执行X + obj2 ,
               同理,会生成一个临时对象Y,先执行完Y的重载+的重载函数后,后调用Y的只带一个int参数的构造函数的执行,然后将Y赋值给obj3.
    **/
    
    
    #if 0
    /****  Test3
     *****/
    class Calculate
    {
        int a;
    public:
        Calculate(void) : a(0)
        {
            cout << "Calculate(void)" << endl;
        }
        Calculate(int val) : a(0)
        {
            a = val;
            cout << "Calculate(int val)" << endl;
        }
        Calculate operator + (const Calculate& obj)
        {
            cout << "obj.a = " << obj.a << endl;
            this->a += obj.a;
            cout << "Calculate operator + (const Calculate& obj)" << endl;
            return *this;
        }
        int Getdata(void)
        {
            return a;
        }
    };
    int main()
    {
        Calculate obj0(4);
        Calculate obj1(3);
        Calculate obj2(4);
    
        Calculate obj3;
        obj3 = obj0 + obj1 + obj2;
        cout << "obj3.Getdata() = " << obj3.Getdata() << endl;
        while (1);
        return 0;
    }
    
    #endif

      

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    洛谷 P1763 状态压缩dp+容斥原理
    hdu4612 Warm up 缩点+树的直径
    UVA-315 无向图求割点个数
    mysql 严格模式 Strict Mode说明
    bak文件恢复成 SQL2005 数据库 的全程讲解
    vps(windows2003)安全设置参考
    window下lamp环境搭建
    centos虚拟机配置网卡连接
    linux Tar 命令参数详解
    linux 打包和压缩的概念和区别
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/13496428.html
Copyright © 2011-2022 走看看