Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么隐式定义复制赋值运算符? 默认构造函数、复制构造函数和Destructor非常重要,我理解C++为什么隐式定义它们。只要想想应该被复制的函数参数,应该被解构的局部变量和应该可以构造的对象,即使你没有说如何构造_C++_C++11 - Fatal编程技术网

为什么隐式定义复制赋值运算符? 默认构造函数、复制构造函数和Destructor非常重要,我理解C++为什么隐式定义它们。只要想想应该被复制的函数参数,应该被解构的局部变量和应该可以构造的对象,即使你没有说如何构造

为什么隐式定义复制赋值运算符? 默认构造函数、复制构造函数和Destructor非常重要,我理解C++为什么隐式定义它们。只要想想应该被复制的函数参数,应该被解构的局部变量和应该可以构造的对象,即使你没有说如何构造,c++,c++11,C++,C++11,但是为什么我们需要隐式定义复制赋值操作符呢?能做a=b真的是必须的吗?这不是改变游戏规则,对吗?有什么强有力的理由我不知道吗 。。。为什么我们需要复制赋值操作符 简单地说,就是支持赋值语义。这些与复制构造语义不同 Foo f1; Foo f2(f1); // copy... Foo f3; f3 = f1; // assignment... 它们是相似的,通常是根据彼此来实现的,但并不相同 为什么它们都是隐式定义的 支持和模仿C风格的值语义。因此,用户定义的类型可以支持与内置类型相同的语义 旁

但是为什么我们需要隐式定义复制赋值操作符呢?能做a=b真的是必须的吗?这不是改变游戏规则,对吗?有什么强有力的理由我不知道吗

。。。为什么我们需要复制赋值操作符

简单地说,就是支持赋值语义。这些与复制构造语义不同

Foo f1;
Foo f2(f1); // copy...
Foo f3;
f3 = f1; // assignment...
它们是相似的,通常是根据彼此来实现的,但并不相同

为什么它们都是隐式定义的

支持和模仿C风格的值语义。因此,用户定义的类型可以支持与内置类型相同的语义

旁注;IIRC,随着移动语义的出现

。。。为什么我们需要复制赋值操作符

简单地说,就是支持赋值语义。这些与复制构造语义不同

Foo f1;
Foo f2(f1); // copy...
Foo f3;
f3 = f1; // assignment...
它们是相似的,通常是根据彼此来实现的,但并不相同

为什么它们都是隐式定义的

支持和模仿C风格的值语义。因此,用户定义的类型可以支持与内置类型相同的语义


旁注;IIRC,随着移动语义的出现…

如果复制构造对象,则可以设置常量成员。假设你已经有了一个对象,然后想做一个赋值。这将违反成员的纪律

为了澄清这一点——因为这篇短文似乎对大多数人来说还不够——这里有一些代码:

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;
}
因此需要赋值运算符,因为它具有不同的语义

Foo f1;
Foo f2(f1); // copy...
Foo f3;
f3 = f1; // assignment...

如果可能的话,它是隐式定义的,因为只要有可能,默认情况下应该定义赋值。注意,在大多数情况下,赋值运算符实际上不是隐式定义的。上面的代码只是一个示例,但还有许多其他情况:例如,如果您有一个用户声明的移动构造函数,那么复制赋值运算符不是隐式定义的。

如果您复制构造一个对象,则可以设置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;
}
因此需要赋值运算符,因为它具有不同的语义

Foo f1;
Foo f2(f1); // copy...
Foo f3;
f3 = f1; // assignment...

如果可能的话,它是隐式定义的,因为只要有可能,默认情况下应该定义赋值。注意,在大多数情况下,赋值运算符实际上不是隐式定义的。上面的代码只是一个例子,但是还有很多其他的例子:如果你有一个用户声明的移动构造函数,那么拷贝赋值操作符不会被隐式定义。

< P>我相信它来自C++的一个属性/能力,它能够编译本机C代码。 在C语言中,您可以将一个结构变量分配给另一个结构变量

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;
}

<> p>所以你应该能够编译这个代码作为C++,因此你必须有一个默认赋值操作符。

我相信它来自C++的一个属性/能力,它能够编译本机C代码。 在C语言中,您可以将一个结构变量分配给另一个结构变量

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++,因此你必须有一个默认赋值操作符。为什么可以复制的东西在默认情况下是不可复制转让的呢?这个问题就像纽约港的哈德逊水域一样不清楚。你说的改变游戏是什么意思?没有什么能改变游戏规则,70000年前人们生活在洞穴中,这与我们现在的生活没有多大区别。@SergeyA,当你试图在这里开玩笑时,人们回答我的问题:请不要冒犯。另请看:想做foo=bar是不自然的;?为什么可以复制的东西在默认情况下是不可复制转让的呢?这个问题就像纽约港的哈德逊水域一样不清楚。你说的改变游戏是什么意思?没有什么能改变游戏规则,70000年前人们生活在洞穴中,这与我们现在的生活没有太大区别。@SergeyA,当你试图在这里开玩笑时,人们回答我的问题:无意冒犯。另请看:我很抱歉,但我很难理解为什么这是一个答案。OP问我们为什么隐式创建复制赋值运算符。@NathanOliver OP还问我们为什么需要复制赋值运算符-这是答案。好的,他两个都问,但这仍然不能回答我们为什么需要复制赋值运算符

这甚至不能回答为什么我们需要复制赋值运算符。@juanchopanza是的,但可能不够清楚。我添加了一些代码,这说明了为什么需要区分复制ctor和复制赋值。很抱歉,我很难理解为什么这是一个答案。OP问我们为什么隐式创建复制赋值运算符。@NathanOliver OP还问我们为什么需要复制赋值运算符-这是答案。好的,他问了两个问题,但这仍然不能回答我们为什么需要复制赋值运算符。这甚至不能回答我们为什么需要复制赋值运算符。@juanchopanza是的,但可能还不够清楚。我添加了一些代码,这说明了为什么需要区分复制ctor和复制赋值。Alex,我想这就是我问题的答案。严格来说,这只是为了向后兼容?为什么你说你不理解这个问题?看起来不错。@LightnessRacesinOrbit最初的问题是关于赋值运算符的一般问题,而不仅仅是默认问题。但是现在我看到这个问题被编辑了…亚历克斯,我想这就是我问题的答案。严格来说,这只是为了向后兼容?为什么你说你不理解这个问题?看起来不错。@LightnessRacesinOrbit最初的问题是关于赋值运算符的一般问题,而不仅仅是默认问题。“但是现在我看到这个问题已经被编辑过了……如果不是因为我坚信这个问题不清楚,没有用,应该被关闭的话,我会投赞成票的。”SergeyA。由你决定。考虑到编辑,我想他已经澄清了。。。除了可能的游戏规则改变者…所以有两个原因1。模仿C风格的语法,并使UDT支持与内置语法相同的语义。@Narek。最初的动机经过多年的改进,但人们强烈希望允许UDT模仿内置类型,这对于支持通用语言非常重要。多年来,我们对这一现象后果的理解不断发展,最终形成了三分法则、五分法则和零分法则。与此相关的是关于这些特殊成员的正式规则的演变——但这些规则都没有带走,事实上,它们增加了支持价值语义的动机。另外,这也与C++中的RAII机制紧密相连。@ Narek,C++的设计和进化使得读起来很好。如果不是我强烈的认为问题不清楚、没有用、应该关闭的话,我们会投票赞成。@ SergeyA。由你决定。考虑到编辑,我想他已经澄清了。。。除了可能的游戏规则改变者…所以有两个原因1。模仿C风格的语法,并使UDT支持与内置语法相同的语义。@Narek。最初的动机经过多年的改进,但人们强烈希望允许UDT模仿内置类型,这对于支持通用语言非常重要。多年来,我们对这一现象后果的理解不断发展,最终形成了三分法则、五分法则和零分法则。与此相关的是关于这些特殊成员的正式规则的演变——但这些规则都没有带走,事实上,它们增加了支持价值语义的动机。另外,这也与C++中的RAII机制紧密相连。@ Narek,C++的设计和进化使得读起来很好。