我在面试中被问到了一个问题。
Is there a way that you can assign the value of one user-defined object to another user-defined object without using = operator.
基本上,他要求我重载该类的赋值运算符,这样重载的赋值运算符就不会使用原始类型 = 运算符。
memcpy
是正确的方法吗?
最佳答案
提出的问题:memcpy 是正确的方法吗?并不总是如此。
隐含的问题:在不使用 = 的情况下重载赋值运算符? 使用 Copy and Swap Idiom .
我将通过解释为什么所问问题的答案是“否”来演示隐含的问题。
memcpy
执行二进制复制,而不将任何上下文应用于正在复制的对象中的变量的性质。它可能非常危险,只能用于 trivially copyable 的物体。 。
考虑以下情况:
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
,但它确实实现了三法则 ( What is The Rule of Three? ),因此可以安全地复制,同时又不可以轻易复制。
看到复制构造函数中正在执行的工作了吗?这不会由 memcpy
执行。 memcpy
将复制 buffer
的值(地址),并留下两个指向同一 buffer
的对象。如果缓冲区共享没有更快地被证明是致命的,最终两个析构函数都必须运行,并且 buffer
将被释放两次。
注意memcpy
用于复制内部缓冲区。缓冲区是一个普通旧数据 (POD) 数组,可以轻松复制。如果它不是简单可复制的,πάντα ῥεῖ 的建议 std::copy
应遵循。无论哪种情况,我们都应该使用 std:::copy ,以便将来更容易修改代码,但该示例并未显示 memcpy 的安全使用.
关于c++ - 重载赋值运算符而不使用=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55069693/