为什么在这里调用复制构造函数?

时间:2016-11-23 09:46:25

标签: c++ c++11 visual-c++ c++14

#include <iostream>
using namespace std;
class A
{
    int x;
public:

    A(int a)
    {   
        x = a;
        cout << "CTOR CALLED";
    }
    A(A &t)
    {
        cout << "COPY CTOR CALLED";
    }
    void display()
    {
        cout << "Random stuff";
    }
    A operator = (A &d)
    {   
        d.x = x;
        cout << "Assignment operator called";
        return *this;
    }
};

int main()
{
    A a(3), b(4);
    a = b;
    return 0;
}

此代码的输出为:

  

CTOR CALLED
  CTOR CALLED
  分配操作员称为   COPY CTOR CALLED

当我在visual studio中使用手表时,它显示即使在调用重载赋值运算符之前,xa的值也已更改。

那么为什么复制构造函数甚至在这里被调用?

2 个答案:

答案 0 :(得分:6)

因为您从赋值运算符返回。它应该返回引用

A& operator = (A &d) { ... }

答案 1 :(得分:3)

正如@SomeProgrammerDude已经说过的那样,因为你按照值返回,而不是像通常那样使用赋值运算符。我想补充一点,你的赋值运算符目前是错误的方法:

A operator = (A &d)
{   
    d.x = x;
    cout << "Assignment operator called";
    return *this;
}

通常你通过const引用传递d,因为我们想要改变this的成员。您正在更改d的成员。由于a = b;实际上正在更改b = a;的成员,因此将a = b;功能性转换为b

使d成为const&可以防止出现这些错误。

您应将其更改为:

A& operator = (A const &d)
{   
    x = d.x;
    cout << "Assignment operator called";
    return *this;
}