C++ 重载赋值运算符而不使用=
我在一次采访中被问到一个问题 是否有一种方法可以将一个用户定义对象的值分配给另一个用户定义对象,而无需使用=运算符 基本上,他让我重载类的赋值运算符,这样重载的赋值运算符就不会使用primitive types=operator memcpy是正确的方法吗?问题:memcpy是正确的方法吗?不总是这样 隐含问题:重载赋值运算符而不使用=?使用 我将通过解释为什么被问问题的答案是“否”来说明隐含的问题 memcpy执行二进制复制,而不将任何上下文应用于被复制对象中变量的性质。它可能是非常危险的,并且只能用于危险的物体上 考虑以下情况:C++ 重载赋值运算符而不使用=,c++,c++11,operator-overloading,assignment-operator,C++,C++11,Operator Overloading,Assignment Operator,我在一次采访中被问到一个问题 是否有一种方法可以将一个用户定义对象的值分配给另一个用户定义对象,而无需使用=运算符 基本上,他让我重载类的赋值运算符,这样重载的赋值运算符就不会使用primitive types=operator memcpy是正确的方法吗?问题:memcpy是正确的方法吗?不总是这样 隐含问题:重载赋值运算符而不使用=?使用 我将通过解释为什么被问问题的答案是“否”来说明隐含的问题 memcpy执行二进制复制,而不将任何上下文应用于被复制对象中变量的性质。它可能是非常危险的,并
struct A
{
int buffersize;
char * buffer;
A(int size):buffersize(size), buffer(new char[buffersize])
{
}
A(const A& source):buffersize(source.buffersize), buffer(new char[buffersize])
{
memcpy(buffer, source.buffer, buffersize);
}
~A()
{
delete[] buffer;
}
A& operator=(A source) // Assignment via Copy and Swap Idiom
{
std::swap(buffersize, source.buffersize);
std::swap(buffer, source.buffer);
}
}
这个例子很愚蠢,也很简单。任何一个理智的人都会使用std::vector,但它确实实现了三个规则,这样就可以安全地进行复制,而不必进行简单的复制
查看复制构造函数中正在执行的工作?这不会由memcpy执行。memcpy将复制buffer的值和地址,并留下两个指向同一个buffer的对象。如果缓冲区的共享没有很快被证明是致命的,那么最终两个析构函数都必须运行,缓冲区将被释放两次
注意:memcpy用于复制内部缓冲区。缓冲区是一个普通的旧数据盒数组,可复制性很低。如果它不是可复制的,πάνταῥεῖ'我们应该遵循他的建议。无论哪种情况,我们都应该使用std:::copy,以便将来更容易修改代码,但是示例没有显示memcpy的安全使用。memcpy是正确的方法吗?用C++很少有。复制似乎是一种更明智的方法。