"screwing up" 赋值运算符的后果是什么?
What are the consequences of "screwing up" the 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:以防万一你想知道,目前我不关心计算时检查单位。
赋值运算符完全没问题。唯一不寻常的是您没有 return 该对象,因此无法链接运算符调用。否则,它就是一个完全正常的运算符。
我想要具有名称和单位的双精度值,但我想像使用简单双精度值一样使用它们。例如我想像这样使用它们:
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:以防万一你想知道,目前我不关心计算时检查单位。
赋值运算符完全没问题。唯一不寻常的是您没有 return 该对象,因此无法链接运算符调用。否则,它就是一个完全正常的运算符。