![](/img/trans.png)
[英]Why not a consolidated Copy constructor and Assignment operator available in C++?
[英]Why isn't the copy assingnment operator called when the copy construcotr is not available in C++?
为什么当我们说我有一个这样声明的对象时: Obj o1;
它由默认构造函数初始化(这里不是很重要, o1
是如何初始化的,重点是它被初始化了),我以这种方式创建了另一个对象: Obj o2 = o1;
隐式调用复制构造函数,但是如果我删除复制构造函数,则会出现编译错误。 为什么对象o1
未分配/复制到o2
,例如: Obj o1; Obj o2; o2 = o1;
Obj o1; Obj o2; o2 = o1;
? 为什么编译器试图在任何实例中调用构造函数? 是Obj o2 = o1;
的=
运算符吗Obj o2 = o1;
超载?
正如评论中提到的,这
Obj o2 = o1;
与赋值无关。 有点不幸,经常令人困惑的是,使用=
进行初始化,否则=
意味着赋值。
在评论中还提到, operator=
必须假设左运算符已经存在。 考虑这个有点人为的例子:
#include <vector>
struct my_vect {
my_vect() : data(2) {}
my_vect(const my_vect& other) : data(other.data) {}
my_vect& operator=(my_vect& other) {
// this has already been constructed,
// hence data.size() is 2 already
data[0] = other.data[0];
data[1] = other.data[1];
return *this;
}
private:
std::vector<int> data;
};
它是一个包含大小始终为2
的std::vector
的结构。 在构造my_vect
初始化向量。 将一个my_vect
分配给另一个时,不需要初始化data
。 只有值必须被复制。 因为operator=
假设左侧运算符已经正确构造(它只是复制到data[0]
和data[1]
)它不可能用于构造对象(在示例中,访问data[0]
或data[1]
将超出范围)。
TL;DR:构造函数构造对象。 分配分配给一个已经存在的对象。 那是两件根本不同的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.