c++ - 重载赋值运算符而不使用=

标签 c++ c++11 operator-overloading assignment-operator

我在面试中被问到了一个问题。

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/

相关文章:

C++ 运算符重载不符合数学要求

C# 运算符重载 ==

c++ - 如何重载operator []以索引自定义 vector 类的shared_ptr元素?

c++ - setHeaderData 不工作 + qt

c# - C# 客户端和 C++ 服务器中套接字上的 Unicode 数据

c++ - 在声明 "std::vector<X> f();"中, "std::vector<X>"是实例化吗?

c++ - stringstream 的重复输出

C++如何检测空格

c++ - 如何声明指向 C++11 std::array 的指针?

c++ - 为什么参数在用于初始化另一个对象时应该按值传递?