超载分配运算符无需使用=
overloading assignment operator without using =
我在面试中被问到一个问题。
是否有一种方法可以将一个用户定义对象的值分配给另一个用户定义的对象而不使用=操作器。
基本上,他要求我超载该类的分配运算符,以使超载分配运算符内置不使用原始类型=运算符。
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
的对象。如果缓冲区的共享并不能尽快证明致命,则最终将必须运行两个灾难,并且buffer
将被释放两次。
注意memcpy
被用于复制内部缓冲区。缓冲区是一系列普通的旧数据(POD),它们是可复制的。如果它不是可以复制的,则应遵循πάνταῥεῖ的std::copy
建议。在任何一种情况下,我们都应使用std:::copy
,以便将来更容易修改代码,但是该示例没有显示memcpy
的安全使用。
相关文章:
- 正在尝试重载二进制搜索树分配运算符
- 自定义先决条件对移动分配运算符有效吗
- C++ - 没有自定义交换功能的移动分配运算符?
- 强制复制分配超过移动分配运算符
- 在之后仍需要使用源对象时调用父移动分配运算符
- c++ 使用动态分配运算符反向数组元素
- 当存在用户定义的移动分配运算符时,已删除模板移动分配运算符
- C++ - 从移动分配运算符调用复制分配
- 不工作 复制分配运算符
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- 返回对象如何与分配运算符一起工作
- 下标是否在分配运算符的右侧进行评估
- C++分配适用于已删除的分配运算符
- 用于删除复制/移动分配运算符的有效签名
- 使用新放置作为复制分配运算符不好吗?
- C++ - 父级中的 CRTP 分配运算符不起作用
- 复制派生类的分配运算符
- 未定义 Lambda 复制分配运算符
- 为什么标准在移动分配运算符中使用交换?
- 正确编写复制构造函数和分配运算符的方法