c ++重载另一个类的赋值运算符

时间:2014-04-04 09:59:26

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

我有一个c ++类来处理分数,我希望它允许转换为double,
我有类似的东西:

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

工作正常,但我想重载赋值运算符,所以我可以直接使用:

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  

我做错了什么?

3 个答案:

答案 0 :(得分:3)

您需要的是转换运算符:

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

您不能将赋值运算符重载为自由函数,这意味着它必须是类成员。由于double不是类,这意味着你有 no 的方式来编写一个赋值afor double。

唯一剩下的就是为您的班级编写转换运算符:

class Fraction {
  //...
public:
  double toDouble() const { return n/d; } 
  operator double() const { return toDouble(); } 
};

话虽如此,这意味着你可以在任何需要double,int,float的地方使用一个分数,因为编译器使用运算符进行隐式转换,不仅要加倍,还要转换为int和其他可能内置转换的类型从双。对于某些类来说,这可能是需要的,但它可能导致歧义和错误,因为人们经常会忽略编译器考虑的转换机会。

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

  explicit operator double() const { return toDouble(); } 

这意味着不允许隐式转换,并且复制初始化将不起作用,但直接初始化将:

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

一点旁注:您应该将转换函数设为const。