“拧紧”赋值运算符会产生什么后果?

时间:2015-07-16 08:47:34

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

我希望使用名称和单位的双值,但我想使用它们就好像它们是简单的双打一样。例如,我想像这样使用它们:

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& v){this->value = v.value;},它并不完全正常,通常对赋值运算符的期望。

我会面临什么不良后果?

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

NamedValue test(NamedValue x){return x;}

没有问题,因为没有涉及任务(只有复制构造函数)。我错过了什么吗?还有什么我应该知道的吗?

ps:万一你想知道,目前我不关心在计算时检查单位。

1 个答案:

答案 0 :(得分:2)

任务操作员完全没问题。唯一不同寻常的是你没有返回对象,因此操作员调用无法链接。否则,它是一个完全正常的操作员。