一个简单的类赋值函数问题

时间:2011-05-12 15:14:09

标签: c++ class assign

我写了一个课

struct opera{
  int a,b;
  int op;
  opera(int a1=0,int b1=0,int op1=-1):a(a1),b(b1),op(op1){}
  opera& operator=(opera& tmp){
    a=tmp.a;
    b=tmp.b;
    op=tmp.op;
}

我想将它分配给这样的数组元素:

ans[a][b]= opera(t.a,t.b,i);

为什么它无法成功编译。

然而,这可行:

opera tmp=opera(t.a,t.b,i);
ans[a][b]= tmp;

当然,struct opera不需要显式赋值函数,而且

ans[a][b]= opera(t.a,t.b,i);   

可以直接使用。

3 个答案:

答案 0 :(得分:5)

如果您想从临时分配,则需要

  opera& operator=(opera const& tmp){

另一行

opera tmp=opera(t.a,t.b,i);

是新对象的初始化,而不是赋值。

答案 1 :(得分:2)

ans[a][b]= opera(t.a,t.b,i);
  

为什么无法成功编译。

调用赋值运算符,这就是无法编译的原因,因为opera(t.a,t.b,i)创建的临时对象不能绑定到赋值运算符参数中的非const引用。您需要做的就是:

 opera& operator=(const opera & tmp)
                //^^^^ note this

答案 2 :(得分:0)

这是因为你的copy ctor / assignment运算符没有通过const引用获取它的参数。否则,当您使用ans[i][j]=opera(a,b,c);创建临时对象时,根据C ++标准,您不能为此对象采用非const引用。因此,您需要使用opera(const opera& o);