码迷,mamicode.com
首页 > 其他好文 > 详细

运算符重载之连续加

时间:2019-05-11 13:32:44      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:com   color   类型转换   iostream   二次   png   cout   public   exp   

#include <iostream>
using namespace std;

class Cp
{
private:
    static int b,
        c;
    int a;
public:
    explicit Cp(int i = 0) : a(i)
    {
        cout << "调用 " << ++b << "次构造\n";
    }
    Cp operator+ (const Cp& p) const
    {
        cout << ++c << " 次调用 " << "+重载\n";
        Cp pTemp = (Cp) (p.a + a);
        return pTemp;
    }
    friend Cp operator+ (int i, const Cp& p);
    friend void operator<< (ostream& out, const Cp& p);
};
int Cp::b = 0;
int Cp::c = 0;

Cp operator+ (int i, const Cp& p)
{
    Cp pTemp = Cp(p.a + i);
    return pTemp;
}
void operator<< (ostream& out, const Cp& p)
{
    out << p.a;
}
                                                                        
int main()
{
    Cp p1(1);
    cout << p1 + (Cp)2 + (Cp)3 + (Cp)5 + p1;
    cout << endl;
    cout << p1 + (Cp)4;
    cout << endl;
    cout << 4 + p1 + (Cp)4 + p1;
    
    system("pause");
     return 0;
} 

 运行结果如下:

技术图片


现在单步调试,看看是如何调用这些构造和重载的;

第一次构造:留意下this->a的值,为1;这是创建对象时调用

技术图片


第二次构造:this->a的值:5;这是强制类型转换时调用

技术图片

 

 

第三次构造:this->a的值:3;这是强制类型转换时调用

技术图片

  

第四次构造:this->a的值:2;这是强制类型转换时调用

技术图片

 

第一次重载:留意下传进来的参数p.a的值:2

技术图片

 

第五次构造:this->a的值:3;这是强制类型转换时调用;3就是p1 + Cp(2)的值技术图片

 

第二次重载:p.a的值:3

技术图片

 

 第六次构造:this->a的值:6;这是强制类型转换时调用;6就是p1 + Cp(2)  + Cp(3)的值;

技术图片

 

第三次重载:p.a的值:5

技术图片

 

第七次构造:this->a的值:11;这是强制类型转换时调用;11就是p1 + Cp(2)  + Cp(3) + Cp(5)的值;

技术图片

 

第四次重载:p.a的值:1

技术图片

 

第八次构造:this->a的值:12;这是强制类型转换时调用;11就是p1 + Cp(2)  + Cp(3) + Cp(5) + p1的值;

技术图片

 

然后输出了结果,

 技术图片

从上面发现的规则:

1、先对 + 的所有非Cp类型操作数进行类型转换,顺序是从右向左;

2、进行加法运算的顺序是从左向右;

3、每进行一次加法运算都return一个临时对象,后面再进行加法时,是用这个临时对象作为左操作数;

可以在Cp类声明中加上

Cp(const Cp& p)
	{
		cout << "第 " << ++d << " 次copy构造\n";
		a = p.a;
	}
static int d;
//在类外初始化int Cp::d = 0;

就可以得到下面的结果:

技术图片

 

运算符重载之连续加

标签:com   color   类型转换   iostream   二次   png   cout   public   exp   

原文地址:https://www.cnblogs.com/IvanKeller/p/10848333.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!