【问题标题】:copy constructor and overloaded '=' operator not working复制构造函数和重载的“=”运算符不起作用
【发布时间】:2015-09-27 11:32:53
【问题描述】:

复制构造函数和重载的“=”运算符在分配两个类对象之和的结果时不会被调用。初始化和分配单个对象时可以正常工作。错误提示“‘operator=’不匹配(操作数类型为‘comp’和‘comp’)”。重要代码sn-ps是

class comp
{
    int a,b;
public:
    comp()
{
    a=b=1;
}
    comp(int,int);
    comp(comp &);
    comp operator+(comp &);
    operator int();
    void show()
    {
        cout<<"a= "<<a<<"b= "<<b<<endl;
    }
    comp& operator=(comp &);
    friend ostream &operator<<(ostream &out, comp &c);
};


    comp::comp(comp & c)//copy constructor
    {
        a=c.a,b=c.b;
        cout<<"copy constructor called"<<endl;
    }
    comp comp::operator+(comp & c1)// overloaded '+' opreator
    {
        comp c;
        c.a=a+c1.a;
        c.b=b+c1.b;
        return c;
    }
    comp & comp::operator =(comp & c)// I tried with return type as void also
    {
         cout<<"in operator ="<<endl;
        a=c.a,b=c.b;
        return *this;
    }
int main()
{
    comp c1,c2(2,3),c3;
    c3=c2+c1;
    cout<<c3;
    comp c4=c3+c1;
    cout<<c4;
    int i=c4;
    cout<<i;
    return 0;
}

【问题讨论】:

  • 你尝试过使用 const-ref 吗?即 comp & comp::operator =(comp const & c) (与您的复制构造函数相同)
  • comp(comp &amp;) 不是复制构造函数。 comp(comp const&amp;) 是。同理comp&amp; operator=(comp&amp;)不是赋值操作符,而是后面会让人头疼的东西。
  • 谢谢 Cechner,当我使用 const-ref 时它可以工作。但是我对comp c4 = c3 + c1这一行有另一个疑问,没有调用复制构造函数,而是调用了默认构造函数。为什么会这样?

标签: c++11 copy-constructor assignment-operator


【解决方案1】:

默认情况下,优化了一些复制操作。为确保不使用复制优化,您应该使用正确的编译器标志。对于 gcc 尝试使用:-no-eligible-constructors

【讨论】:

    【解决方案2】:

    让我们走这条线

    comp c4=c3+c1;
    

    c3+c1 操作返回一个临时对象。但是,非常量引用不能绑定到临时对象,并且您的复制构造函数将其参数作为非常量引用。

    解决方法很简单,将复制构造函数和复制赋值运算符改为将它们的参数作为常量引用,例如

    comp(const comp& c);
    

    请注意,使用非常量引用参数,例如复制构造函数仍然可以使用它,您只需将实际的非临时对象传递给它,例如

    comp c1;
    comp c2 = c1;  // Should work with non-constant reference
    

    【讨论】:

    • 是的,语句 comp c2=c1;正在使用非常量参考。现在我改为 const comp&c。重载的 '=' 工作正常,但没有为语句 comp c4=c3+c1 调用复制构造函数;
    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 2018-11-20
    • 2014-10-12
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多