C++ 为什么C+中没有统一的复制构造函数和赋值运算符+;?
我确实理解调用相应函数(复制构造函数和赋值运算符)的场景。这两个函数实际上都在执行相同的功能—为动态数据成员正确分配内存,并从传递的参数对象复制数据,以便两个对象在数据中看起来完全相同。为什么不在这种情况下,C++提供了一个统一的(一个函数),这两种情况都会被调用,而不是通过提供两种变体来复杂化? 它们不一样,如果有人强迫它们,那将是一种痛苦。 复制构造是创建对象的一种方法。除此之外,还可以使用基本成员初始值设定项。在多线程代码中,您不必太担心构造函数中的互斥单元,因为您不能同时创建同一个对象 赋值运算符做的是完全不同的事情。它对已经存在的对象进行操作,并应返回对self的引用。在这里,一个实现可以做细微不同的事情,参见复制构造。例如,如果新分配的字符串较小,字符串类可能不会释放资源 在简单的情况下,它们很可能会做同样的事情,并丢弃赋值的返回值。但是,在这种情况下,您可以依赖编译器自动生成的代码。它们是如此不同。在特殊情况下,它们可能是相同的,但一般来说,不是 当你有这样的东西时:C++ 为什么C+中没有统一的复制构造函数和赋值运算符+;?,c++,C++,我确实理解调用相应函数(复制构造函数和赋值运算符)的场景。这两个函数实际上都在执行相同的功能—为动态数据成员正确分配内存,并从传递的参数对象复制数据,以便两个对象在数据中看起来完全相同。为什么不在这种情况下,C++提供了一个统一的(一个函数),这两种情况都会被调用,而不是通过提供两种变体来复杂化? 它们不一样,如果有人强迫它们,那将是一种痛苦。 复制构造是创建对象的一种方法。除此之外,还可以使用基本成员初始值设定项。在多线程代码中,您不必太担心构造函数中的互斥单元,因为您不能同时创建同一个对象
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:的确,请随便给出答案。我正在查看它的具体失败之处。你认为复制赋值与复制构造函数类似吗,但与析构函数不同?毕竟,在赋值过程中,必须先处理旧值,然后才能将对象设置为新(复制)值。