C++11 复制构造函数并重载'=';操作员不工作

C++11 复制构造函数并重载'=';操作员不工作,c++11,copy-constructor,assignment-operator,C++11,Copy Constructor,Assignment Operator,当使用两个类对象之和的结果赋值时,不会调用复制构造函数和重载“=”运算符。当初始化和分配单个对象时,有个对象可以正常工作。错误为“运算符=”不匹配(操作数类型为“comp”和“comp”)。重要的代码片段包括 class comp { int a,b; public: comp() { a=b=1; } comp(int,int); comp(comp &); comp operator+(comp &); operator

当使用两个类对象之和的结果赋值时,不会调用复制构造函数和重载“=”运算符。当初始化和分配单个对象时,有个对象可以正常工作。错误为“运算符=”不匹配(操作数类型为“comp”和“comp”)。重要的代码片段包括

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;
}
class comp
{
INTA,b;
公众:
comp()
{
a=b=1;
}
comp(int,int);
comp(comp&);
comp运算符+(comp&);
运算符int();
无效显示()
{
我们还是走这条线吧

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

修复方法很简单,更改复制构造函数和复制赋值运算符,改为将其参数作为常量引用,例如

comp(const comp& c);

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

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

默认情况下,一些复制操作是优化的。为了确保没有使用复制优化,您应该使用适当的编译器标志。对于gcc,请尝试使用:-没有合格的构造函数

您是否尝试使用常量引用?即comp&comp::operator=(comp const&c)(对于您的复制构造函数相同)
comp(comp&)
不是复制构造函数。
comp(comp const&)
是。以相同的方式
comp&operator=(comp&)
不是赋值运算符,但稍后会产生很多麻烦。谢谢Cechner,当我使用const-ref时它工作。但是我对comp c4=c3+c1行还有一个疑问,没有调用复制构造函数,而是调用了默认构造函数。为什么会发生这种情况?是的,语句comp c2=c1;正在工作使用非常量引用。现在我改为常量comp&c。重载的“=”工作正常,但没有为语句comp c4=c3+c1调用复制构造函数;