【问题标题】:A easy question of assignment function of class一个简单的类赋值函数问题
【发布时间】:2011-08-24 05:27:58
【问题描述】:

我写了一门课

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);   

可以直接工作。

【问题讨论】:

  • 你遇到了什么编译错误?
  • 博佩尔松的答案是对的!

标签: c++ class assign


【解决方案1】:

当你想从临时分配时,你需要

  opera& operator=(opera const& tmp){

另一行

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

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

【讨论】:

  • 那不是opera& operator=(const opera& tmp) 吗?
  • @QuantumMechanic: const opera &opera const& 完全一样!只是语法不同。
  • @Quantum - 是的,但它们是相同的。 const 可以在它应用到的类型之后,也可以在最左边的类型之前。我选择将其设为 const& 以使其成为 const 引用。
  • 为什么临时变量必须是 const?
  • @QuantumMechanic const 修改它之前的内容,除非它之前没有任何内容。在大多数情况下(例如int *const,使指针变为常量,或void Class::func() const,使函数变为常量),您必须将它放在它修改的内容之后。许多人更喜欢在每种情况下都将其放在后面,出于一致性的原因,并且在涉及 typedef 时避免混淆:typedef int* PI; const PI pi;pi 类型 int *const
【解决方案2】:
ans[a][b]= opera(t.a,t.b,i);

为什么编译不成功。

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

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

【讨论】:

    【解决方案3】:

    这是因为您的复制 ctor/赋值运算符没有通过 const 引用获取其参数。否则,当您使用ans[i][j]=opera(a,b,c); 时,会创建一个临时对象,并且根据 C++ 标准,您不能对该对象进行非常量引用。因此你需要使用opera(const opera& o);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      相关资源
      最近更新 更多