c++;重载另一个类的赋值运算符 我有一个C++类来处理分数,我希望它能转换为两倍, 我有这样的想法: class fraction { double n,d; public: fraction(double _n, double _d) {n = _n; d = _d;} //some functions double todouble() {return n/d;} }; fraction frac(1,2); double dbl = frac.todouble();

c++;重载另一个类的赋值运算符 我有一个C++类来处理分数,我希望它能转换为两倍, 我有这样的想法: class fraction { double n,d; public: fraction(double _n, double _d) {n = _n; d = _d;} //some functions double todouble() {return n/d;} }; fraction frac(1,2); double dbl = frac.todouble();,c++,class,operator-overloading,assignment-operator,C++,Class,Operator Overloading,Assignment Operator,这很好,但我想重载赋值运算符,以便直接使用: double dbl = frac; 我试图补充这一点: double double::operator =(double& dbl, fraction& frac) {return dbl = frac.n / frac.d;} 这导致了以下编译错误: error: ‘double fraction::operator=(double&, fraction&)’ must take exactly on

这很好,但我想重载赋值运算符,以便直接使用:

double dbl = frac;  
我试图补充这一点:

double double::operator =(double& dbl, fraction& frac) {return dbl = frac.n / frac.d;}  
这导致了以下编译错误:

 error: ‘double fraction::operator=(double&, fraction&)’ must take exactly one argument  

我做错了什么?

您需要的是转换运算符:

operator double() const { return n / d; }

如果您希望能够将
双精度
分配给
分数
,则可以声明非显式构造函数:

fraction(double d = 0, double n = 1) : d(d), n(n) {}
反过来呢

operator double() const { return n/d; }
然后

fraction f;

f = 12.5;      // Assign a double to fraction

double x = f;  // Assign fraction as double to a double

不能将赋值运算符作为自由函数重载,这意味着它必须是类成员。因为double不是类,这意味着你没有办法为double写作业

剩下的就是为类编写一个转换运算符:

class Fraction {
  //...
public:
  double toDouble() const { return n/d; } 
  operator double() const { return toDouble(); } 
};
话虽如此,这意味着您可以在需要double、int、float的任何位置使用分数,因为编译器使用运算符进行隐式转换,不仅转换为double,还转换为int和其他可能从double进行内置转换的类型。某些类可能需要这样做,但这可能会导致歧义和错误,因为人们经常忽略编译器考虑的转换机会

在C++11中,可以使运算符显式:

  explicit operator double() const { return toDouble(); } 
这意味着不允许隐式转换,复制初始化将不起作用,但直接初始化将:

 double dbl = frac;  //Error
 double dbl{frac};   //Ok 

一点旁注:您应该将转换函数设置为常量

看。赋值运算符不能作为独立(非成员)函数重载。如果您可以控制该类并对其进行修改,则可以生成转换运算符:
operator double()const{return todouble();}
它必须仍然是成员函数。
double
不是类,也没有成员。通常,我建议避免隐式转换。当然,显式转换(如
todouble
)要稍微详细一点,但另一方面,它们只在您想要的地方发生。提供两种方式作为隐式转换机会意味着您可以在需要这两种类型中的任何一种时使用这两种方式,等等,因为这使得从分数到整数的隐式转换成为可能。这是一件危险的事情,因为你会得到很多歧义和无声的转换,这应该是错误的。构造函数签名应该是
分数(双n=0,双d=1)