首页 > 解决方案 > 运算符重载(对象添加)

问题描述

#include "stdafx.h"
#include "iostream"
using namespace std;

class complex
{
    int real;
    int img;
public:
    complex(int x = 0, int y = 0)
    {
        cout << "Inside Prama" << endl;
        real = x;
        img = y;
    }
    complex operator+(complex x)
    {
        complex temp;
        temp.real=real + x.real;
        temp.img=img + x.img;
        return temp;
    }
    void display()
    {
        cout << real << ' ' << img << endl;
    }
};

int main()
{
    class complex c1(5,6), c2(7,8),c3(7,7),c4;
    c1.display();
    c2.display();
    c3.display();
    c4 = c1+c2+c3;
    c4.display();
    return 0;
}

对于上述运算符重载代码,输出如下:

在此处输入图像描述

为什么在添加对象时调用参数化构造函数。我没有得到原因

标签: c++c++14

解决方案


只是总结评论...

这里

complex operator+(complex x)
{
    complex temp;
    temp.real=real + x.real;
    temp.img=img + x.img;
    return temp;
}

complex temp;调用构造函数,这就是你看到的输出。通常,您会x作为const参考传递以避免复制,但由于您需要一个副本,无论如何您都可以使用x

complex operator+(complex x)
{
    x.real +=real;
    x.img +=img;
    return x;
}

这只会在您调用运算符时调用编译器生成的复制构造函数。


还有更多微妙之处需要考虑。使用x而不是制作本地副本会禁止命名返回值优化。也很常见的实现operator+operator+=然后operator+可以是一个自由功能。请注意,这operator+=可能更有效,因为根本不需要副本。有关运算符重载的更多详细信息,请参阅运算符重载的基本规则和惯用语是什么?


PS:“参数化构造函数”是迄今为止我只在糟糕的误导性教程中看到的术语。这不是一个官方术语。这里的相关术语是默认构造函数complex(int x = 0, int y = 0)是一个默认构造函数,因为它可以在没有参数的情况下调用。这是一个很好的例子,说明了为什么“参数化构造函数”没有传达很多含义并且相当具有误导性。


推荐阅读