【问题标题】:What are the consequences of "screwing up" the assignment operator?“搞砸”赋值运算符的后果是什么?
【发布时间】:2015-10-05 14:53:42
【问题描述】:

我希望有一个带有名称和单位的双精度值,但我想将它们用作简单的双精度值。例如我想像这样使用它们:

int main(){
    NamedValue a("a","m");
    NamedValue b("b","m");
    NamedValue c("c","m^2");
    a = 3;
    b = 5;
    c = a*b;
    std::cout << a << b << c <<  std::endl;
    return 0;
}

输出应该是:

a = 3 m
b = 5 m
c = 15 m^2

我想出了这个解决方案:

class NamedValue  {
public:
    NamedValue(std::string n,std::string u) : name(n),units(u){}
    const std::string name;
    const std::string units;
    void operator=(double v){this->value = v;}
    void operator=(const NamedValue& v){this->value = v.value;}
    operator double() const { return value; }      
private:
    double     value;
};

std::ostream& operator<<(std::ostream& stream,const NamedValue& v) {
     stream << v.name << " = " << (double)v <<  " " << v.units << std::endl;
     return stream;
}

Unitl 现在它工作得很好,但我主要关心的是赋值运算符void operator=(const NamedValue&amp; v){this-&gt;value = v.value;},它并没有完全按照人们通常对赋值运算符的期望。

我会面临什么不良后果吗?

我正在考虑诸如将对象作为参数传递之类的事情。但是,像这样的功能

NamedValue test(NamedValue x){return x;}

没有问题,因为不涉及分配(仅复制构造函数)。我错过了什么吗?还有什么需要注意的吗?

ps:以防你想知道,目前我不在乎在计算时检查单位。

【问题讨论】:

  • 您为什么不尝试使用该赋值运算符,看看会发生什么?如果您不在乎 nameunits 未设置,那么它“有效”。但它看起来确实很奇怪。
  • @juanchopanza 我试过了,它按预期工作。但是,我尝试了它有意编写的内容(即在c=a+b 之类的表达式中),现在我想知道是否还有其他需要正常工作的赋值运算符(即真正分配完整对象而不是只是其中一个字段)可能会失败。
  • @juanchopanza 抱歉,我有点困惑:c=a+b 实际上并没有使用我所说的赋值运算符(但带有NamedValue=double 的那个)。

标签: c++ operator-overloading assignment-operator


【解决方案1】:

赋值运算符完全没问题。唯一不寻常的是您没有返回对象,因此无法链接操作员调用。否则,它是一个完全正常的运算符。

【讨论】:

  • 你的意思是“链式”,如果不是,我不明白;)
  • 其实我误解了 3 的规则。我虽然“当你重载其中任何一个时,你应该重载所有”,但在再次查阅之后,我明白“当你 必须重载其中任何一个,您都应该重载所有“。所以这真的很好,这个问题有点愚蠢;)
猜你喜欢
  • 2021-04-16
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 2017-03-01
  • 2015-12-25
相关资源
最近更新 更多