为什么使用复制构造函数而不是赋值运算符
Why is the copy constructor being used instead of the assignment operator
这就是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的语法糖。
相关文章:
- 复制构造函数、赋值运算符C++
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 非模板 std::reference_wrapper赋值运算符和模板构造函数
- 复制构造函数和赋值运算符的值类实现
- 在C++中,我可以在定义自己的复制构造函数后跳过定义赋值运算符吗?
- 为什么我的类工作正常,即使在返回垃圾值作为赋值运算符和空复制构造函数的返回之后
- 禁止复制构造函数和赋值运算符singleton类
- 复制构造函数和复制赋值运算符是否应具有相同的语句?
- 重载赋值运算符函数和复制构造函数中的错误
- 构造函数中的赋值运算符
- 为什么定义移动构造函数会删除移动赋值运算符
- 为什么可以使用已删除的移动构造函数和赋值运算符移动对象?
- 模板的赋值运算符(成员函数)实现的正确语法
- 错误的数组初始化与赋值副本构造函数初始化
- 赋值复制构造函数
- 赋值给构造函数中的常量变量
- 成员初始化列表vs赋值/复制构造函数(在boost deadline_timer中)
- 将传递的对象赋值给构造函数中的成员对象