C ++,从函数调用赋值给类实例?

时间:2012-04-13 16:09:29

标签: c++ class constructor variable-assignment copy-constructor

我理解,或者至少有一个想法,为什么以下代码不起作用:

class Spambar {
    public:
        Spambar() {};
        Spambar(Spambar& sb) {};

        Spambar operator + (Spambar sb) {
            Spambar new_sb;
            return new_sb;
        }
};

int main() {
    Spambar sb1;
    Spambar sb2;
    Spambar sb3 = sb1 + sb2;  // <<< Error: "No matching function for call to ... "
}

我想问题是,复制构造函数需要引用Spambar实例。由于没有引用但返回浅实例,编译失败。

那么,我该如何实现呢?

2 个答案:

答案 0 :(得分:3)

问题是sb1 + sb2的结果是暂时的;用于初始化sb3的复制构造函数需要非const引用;并且你不能对非临时的const引用。

您几乎肯定希望通过将构造函数的参数类型更改为Spambar const &来解决此问题。当你在这里时,你几乎肯定会对operator+做同样的事情,同时也让操作员自己const

Spambar(Spambar const &);
Spambar operator + (Spambar const &) const;

如果你正在做一些非常奇怪的事情,并且实际上希望复制构造函数修改它的参数,那么你必须要么避免将临时值传递给它,要么对mutable或{做一些讨厌的hackery {1}}。在C ++ 11中,您将使用参数类型为const_cast的移动构造函数来处理此类事情。

答案 1 :(得分:2)

您的类没有使用const引用的复制构造函数。通常,复制构造函数如下所示:

Spambar(const Spambar&);

您展示的表单仅在极少数情况下使用,可能会阻止您的代码正常工作。