Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/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
C++ 为什么C+中没有统一的复制构造函数和赋值运算符+;?_C++ - Fatal编程技术网

C++ 为什么C+中没有统一的复制构造函数和赋值运算符+;?

C++ 为什么C+中没有统一的复制构造函数和赋值运算符+;?,c++,C++,我确实理解调用相应函数(复制构造函数和赋值运算符)的场景。这两个函数实际上都在执行相同的功能—为动态数据成员正确分配内存,并从传递的参数对象复制数据,以便两个对象在数据中看起来完全相同。为什么不在这种情况下,C++提供了一个统一的(一个函数),这两种情况都会被调用,而不是通过提供两种变体来复杂化? 它们不一样,如果有人强迫它们,那将是一种痛苦。 复制构造是创建对象的一种方法。除此之外,还可以使用基本成员初始值设定项。在多线程代码中,您不必太担心构造函数中的互斥单元,因为您不能同时创建同一个对象

我确实理解调用相应函数(复制构造函数和赋值运算符)的场景。这两个函数实际上都在执行相同的功能—为动态数据成员正确分配内存,并从传递的参数对象复制数据,以便两个对象在数据中看起来完全相同。为什么不在这种情况下,C++提供了一个统一的(一个函数),这两种情况都会被调用,而不是通过提供两种变体来复杂化?

它们不一样,如果有人强迫它们,那将是一种痛苦。 复制构造是创建对象的一种方法。除此之外,还可以使用基本成员初始值设定项。在多线程代码中,您不必太担心构造函数中的互斥单元,因为您不能同时创建同一个对象

赋值运算符做的是完全不同的事情。它对已经存在的对象进行操作,并应返回对self的引用。在这里,一个实现可以做细微不同的事情,参见复制构造。例如,如果新分配的字符串较小,字符串类可能不会释放资源

在简单的情况下,它们很可能会做同样的事情,并丢弃赋值的返回值。但是,在这种情况下,您可以依赖编译器自动生成的代码。

它们是如此不同。在特殊情况下,它们可能是相同的,但一般来说,不是

当你有这样的东西时:

std::vector myVec = myOtherVec;
它看起来像赋值,但实际上正在调用复制构造函数

复制构造函数从零开始一个对象

这又回到了一个基本问题,即
malloc
(保留内存的旧C方法)和
new
之间有什么区别。不同之处在于:<代码> NeX/COD>调用对象的构造函数,这在C++中非常重要,否则我们将谈论垃圾内存,除非它是显式的,否则不能初始化。 例如,在
std::vector
的内部实现中,有一个
size
变量,用于跟踪用户使用
push_back()
resize
主动确认的元素数(我们不是在谈论保留)

现在想象一下它是如何实现的:

template <typename T>
class vector
{
    int size;
    T* theArray;
    void reserveMyMemory(); //ignoring allocators for simplicity
}
模板
类向量
{
整数大小;
T*theArray;
void reserveMyMemory();//为了简单起见,忽略分配器
}
复制构造函数和赋值运算符之间有什么区别

  • 赋值运算符:只复制大小和数组内容
  • 复制协构造函数:必须保留内存并初始化变量,然后复制
现在,内存保留需要检查
大小
,以及
阵列
是否为
空ptr
。如果在内部使用赋值运算符,会发生什么?一场灾难。因为这些值没有初始化。所以,您需要一个构造函数来启动


在这种情况下,复制构造函数更通用,因为它应该初始化变量,然后复制它必须复制的元素。当然,整个例子只是一个演示。不要从字面上理解std::vector,STL不是这样工作的。

复制赋值也需要担心自赋值,而复制构造不需要。@Pandatyr:的确,请随便给出答案。我正在查看它的具体失败之处。你认为复制赋值与复制构造函数类似吗,但与析构函数不同?毕竟,在赋值过程中,必须先处理旧值,然后才能将对象设置为新(复制)值。