C++ C++;赋值运算符,我们可以用副本替换它吗?

C++ C++;赋值运算符,我们可以用副本替换它吗?,c++,operators,copy-constructor,assignment-operator,C++,Operators,Copy Constructor,Assignment Operator,当我阅读时: 赋值运算符和复制运算符有什么区别 建造师 在这里: 显示了以下示例: A aa; A a = aa; //copy constructor vs: 我的问题是,为什么我们需要赋值操作符?我的意思是,在这种情况下,当拷贝构造函数执行相同的任务时,使用拷贝构造函数将更有效 有人能给出一个真实的例子,说明在复制构造函数无法替代赋值运算符的情况下如何使用赋值运算符吗?如果要在已构造值之后更改该值,则需要赋值。例如: 更改已存储在std::map 更改std::vector中的第n个值

当我阅读时:

赋值运算符和复制运算符有什么区别 建造师

在这里:

显示了以下示例:

A aa;
A a = aa;  //copy constructor
vs:

我的问题是,为什么我们需要赋值操作符?我的意思是,在这种情况下,当拷贝构造函数执行相同的任务时,使用拷贝构造函数将更有效


有人能给出一个真实的例子,说明在复制构造函数无法替代赋值运算符的情况下如何使用赋值运算符吗?

如果要在已构造值之后更改该值,则需要赋值。例如:

  • 更改已存储在
    std::map
  • 更改
    std::vector中的第n个值
  • 更改循环外部变量的值
  • 更改作为指针或引用提供的输出参数的值

这个名单可能真的几乎没完没了。但在您的示例中,确实可以避免使用赋值。

复制构造函数只在初始化对象时调用一次。当调用复制构造函数时,它会将一个新的内存块分配给变量,然后将其分配给另一个对象

但是在赋值构造函数中,只有一个对象中的字段值被复制到另一个对象,并且调用赋值构造函数时分配相同的内存。这是复制构造函数和赋值构造函数之间的主要区别。复制构造函数将单独的内存分配给两个对象,即新创建的目标对象和源对象。赋值运算符将相同的内存位置分配给新创建的目标对象和源对象


复制构造函数在对象生存期内只调用一次,如果它在声明期间初始化的话。每隔向其分配其他对象时,将调用赋值构造函数。

是的,有一个著名的构造函数,其中赋值运算符不能被复制构造函数替换:

 std::vector <int> f();
 void g(){
     decltype(auto) v = f() = f();
     v.push_back(10); //boum undefined behaviour.
        //without the non ref qualified copy assignment operator you
        //could not have the pleasure to have undiscoverable UB in your code.
     }
std::vector f();
void g(){
decltype(自动)v=f()=f();
v、 向后推(10);//boum未定义的行为。
//如果没有非ref限定的复制分配运算符,您
//在您的代码中不能有未被发现的UB。
}

非ref限定的赋值运算符和预递增和预递减迭代器运算符是标准库提供的生成悬空引用的最佳机会。

任何副本赋值理论上都可以用调用析构函数,然后调用副本构造函数来代替,因为构造函数不负责为新实例分配内存。实际上,您可以使用placement new操作符调用构造函数,而无需分配任何内存

但是,拷贝赋值仍然比拷贝构造函数有趣,并且您认为拷贝构造函数性能更好的假设是错误的

复制赋值和构造函数之间的最大区别在于,在赋值中,您可以依赖内存已经初始化的事实。在最好的情况下,这种预初始化不会带来任何好处,复制构造函数的性能与复制赋值一样好。在其他情况下,复制分配从中受益,并且比构造函数性能更好


您可以增加调用析构函数的成本,而复制构造函数在赋值过程中变得更不有趣。

我的意思是,在这种情况下,当复制构造函数执行相同的任务时,使用它会更有效。-无论用户选择做什么,您的类都应该工作。有人能给出一个真实的例子,说明在复制构造函数无法替代赋值运算符的情况下如何使用赋值运算符吗?--<代码>整数x=10;int y=4;如果(某物)x=y假设您正在使用allready创建的对象池,您需要从数组或向量的中间复制删除元素的AMR?在没有赋值的情况下,你如何“移位”其他元素?@PaulMcKenzie为什么不
inty=4;intx=(某物)?y:10?为什么不步行25英里而不是开车?这基本上就是我们要讨论的问题。当可以进行简单的重新分配时,以这种方式编写代码是毫无意义的。你的答案是错误的,“但是在赋值构造函数中,只有一个对象中的字段值被复制到另一个对象。当赋值构造函数被称为“@smith_brown”时,不会分配新内存——对于可复制的类型,没有分配新内存,编译器执行有效的复制(可能使用
memcpy
)操作。我建议使用一些更标准的语言。构造函数不分配对象存储(他们需要已经分配存储)。此外,C++中没有任何赋值构造函数。
 std::vector <int> f();
 void g(){
     decltype(auto) v = f() = f();
     v.push_back(10); //boum undefined behaviour.
        //without the non ref qualified copy assignment operator you
        //could not have the pleasure to have undiscoverable UB in your code.
     }