首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么复制赋值运算符是隐式定义的?

为什么复制赋值运算符是隐式定义的?
EN

Stack Overflow用户
提问于 2016-05-11 12:34:28
回答 3查看 725关注 0票数 1

默认构造函数、复制构造函数和析构函数非常重要,我理解为什么C++隐式定义它们。只需考虑应该复制的函数参数、应该销毁的局部变量和应该可构造的对象,即使您不知道如何构造。

但是为什么我们需要拷贝赋值操作符隐式定义的?做a = b真的是必须的吗?这不是在改变游戏,对吗?有什么强烈的理由我不知道?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-11 12:36:27

..。为什么我们需要拷贝分配操作符?

简单地说,是为了支持赋值语义。它们与复制构造语义不一样。

代码语言:javascript
复制
Foo f1;
Foo f2(f1); // copy...
Foo f3;
f3 = f1; // assignment...

它们是相似的,而且常常是以彼此的方式实现的,但不是相同的。

为什么它们都会被隐式定义?

支持和模仿C样式的值语义。,以便用户定义的类型能够支持与内置类型相同的语义。

附带说明;IIRC,已经出现了带有移动语义的some deprecation of rules here .

票数 7
EN

Stack Overflow用户

发布于 2016-05-11 12:43:49

我相信它来自于C++的一个属性/功能,它能够编译本地C代码。

在C语言中,您可以将一个struct变量赋值给另一个。

代码语言:javascript
复制
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++,因此您的必须具有默认赋值操作符

票数 4
EN

Stack Overflow用户

发布于 2016-05-11 12:39:29

如果复制-构造对象,则可以设置const成员。想象一下,您已经有了一个对象,然后想要执行一个任务。这将违反成员的忠诚度。

为了澄清这一点--因为这个简短的文本似乎不足以满足大多数人的需要--这里有一些代码:

代码语言:javascript
复制
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构造函数,那么复制赋值操作符就不会被隐式定义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37162869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档