为什么使用复制构造函数而不是赋值运算符

Why is the copy constructor being used instead of the assignment operator

本文关键字:赋值运算符 构造函数 复制 为什么      更新时间:2023-10-16

这就是MyClass的定义:

class MyClass {
    double x, y;
    public:
        MyClass (double a = 0., double b = 0.) {
            x = a;
            y = b;
            cout << "Using the default constructor" << endl;
        }
        MyClass (const MyClass& p) {
            x = p.x;
            y = p.y;
            cout << "Using the copy constructor" << endl;
        }
        MyClass operator =(const MyClass& p) {
            x = p.x;
            y = p.y;
            cout << "Using the assignment operator" << endl;
            return *this;
        }
};

我测试了在我的主程序中调用每个构造函数或方法的时间:

int main() {
    cout << "MyClass p" << endl; MyClass p; cout << endl;
    cout << "MyClass r(3.4)" << endl; MyClass r(3.4); cout << endl;
    cout << "MyClass s(r)" << endl; MyClass s(r); cout << endl;
    cout << "MyClass u = s" << endl; MyClass u = s; cout << endl;
    cout << "s = p" << endl; s = p; cout << endl;
}

为什么在第四个示例MyClass u = s中使用复制构造函数而不是赋值运算符?

编辑

包括输出,如要求:

MyClass p
Using the default constructor
MyClass r(3.4)
Using the default constructor
MyClass s(r)
Using the copy constructor
MyClass u = s
Using the copy constructor
s = p
Using the assignment operator
Using the copy constructor

因为这不是一个实际的赋值,因为您同时声明了u。因此,调用构造函数而不是赋值运算符。这更有效,因为如果没有这个功能,就会有先调用默认构造函数,然后调用赋值运算符的冗余。这会引发不需要的副本的创建,从而显著降低C++模型的性能。

因为这是变量的声明和初始化,而不是将值分配给现有变量。在变量声明的上下文中,=只是将参数传递给ctor的语法糖。