利用复制运算符作为赋值运算符

时间:2017-06-20 21:57:02

标签: c++

由于我的复制操作符正是我想要的赋值操作符,因此调用复制操作符。我查看了类似的帖子,我尝试创建一个新的临时对象,我打开复制操作符然后返回临时值,但这不起作用。所以我尝试发回一个参考文献,但这也不起作用。

SelfDestructingMessage& SelfDestructingMessage::operator=(
    SelfDestructingMessage &source){
    this(source);
    return *this;
    }

如何返回引用,而不是副本?

2 个答案:

答案 0 :(得分:3)

你很亲密。您需要交换,以便您的赋值运算符如下所示:

struct my_object
{
    my_object& operator=(my_object const& other)
    {
        my_object tmp(other);
        swap(*this,other);
        return *this;
    }
 };

您希望swapnothrow,以确保您的安全。请注意,如果您只是按值接受参数,则可以删除名称tmp,并允许进行一些重要的优化。

这被称为"复制交换习语"。有很多来源,但最好用Sutter的Exceptional C ++来解释。他详细描述了它,一些变化,为什么它使一切变得更容易。当你将它与pimpl配对时,你可以获得很多优势......在大多数情况下对性能有一些非常小的影响 - 有时它真的很重要而且你不能做一个pimpl(指针间接可能会混淆预取器)等等。

我不知道WTF Michael Roy的意思。我确实在复制构造函数中看到了像*this = other这样的废话,但是每一个做过这种事情的开发人员也做了很多其他非常愚蠢的事情,最终给很多人带来了麻烦。仅仅因为有些人做了某些事并不意味着你需要从悬崖上跟随它们进入废话。

答案 1 :(得分:-3)

你正在倒退。重用对象复制代码的最简单方法是从复制构造函数中调用=运算符。

struct A
{
   A(const A& other) { *this = other; }

   A& operator = (const A& other) { /*....*/ return *this; } 
};

在大多数情况下,C ++默认的拷贝构造函数和运算符就足够了,你应该尽可能地依赖它们。