默认构造函数、复制构造函数和析构函数非常重要,我理解为什么C++隐式定义它们。只需考虑应该复制的函数参数、应该销毁的局部变量和应该可构造的对象,即使您不知道如何构造。
但是为什么我们需要拷贝赋值操作符隐式定义的?做a = b真的是必须的吗?这不是在改变游戏,对吗?有什么强烈的理由我不知道?
发布于 2016-05-11 12:36:27
..。为什么我们需要拷贝分配操作符?
简单地说,是为了支持赋值语义。它们与复制构造语义不一样。
Foo f1;
Foo f2(f1); // copy...
Foo f3;
f3 = f1; // assignment...它们是相似的,而且常常是以彼此的方式实现的,但不是相同的。
为什么它们都会被隐式定义?
支持和模仿C样式的值语义。,以便用户定义的类型能够支持与内置类型相同的语义。
附带说明;IIRC,已经出现了带有移动语义的some deprecation of rules here .
发布于 2016-05-11 12:43:49
我相信它来自于C++的一个属性/功能,它能够编译本地C代码。
在C语言中,您可以将一个struct变量赋值给另一个。
typedef struct foo_s
{
int field1;
int field2;
} foo_t;
int main ()
{
foo_t a, b;
a.field1 = 1;
a.field2 = 2;
b = a;
return 0;
}因此,您应该能够将此代码编译为C++,因此您的必须具有默认赋值操作符。
发布于 2016-05-11 12:39:29
如果复制-构造对象,则可以设置const成员。想象一下,您已经有了一个对象,然后想要执行一个任务。这将违反成员的忠诚度。
为了澄清这一点--因为这个简短的文本似乎不足以满足大多数人的需要--这里有一些代码:
struct C {
const int i;
C(int i) :i(i) {};
};
int main(void) {
C a(5), b(7);
a = b; // compiler error
C c(a); // no error
return 0;
}所以需要赋值操作符,因为它有不同的语义。
它是隐式定义的--如果可能的话--因为在可能的情况下,应该默认定义赋值。注意,在大多数情况下,赋值运算符实际上不是隐式定义的。上面的代码只是一个例子,但是还有许多其他的情况:例如,如果您有一个用户声明了move构造函数,那么复制赋值操作符就不会被隐式定义。
https://stackoverflow.com/questions/37162869
复制相似问题