关于C ++中赋值运算符的问题

时间:2009-05-26 04:36:20

标签: c++ operator-overloading

原谅一些看起来很简单的问题,但我记得这个用例:

struct fraction {
    fraction( size_t num, size_t denom ) : 
        numerator( num ), denominator( denom )
    {};
    size_t numerator;
    size_t denominator;
};

我想做的是使用如下语句:

fraction f(3,5);
...
double v = f; 

v现在保持我的分数代表的值。 我将如何在C ++中执行此操作?

5 个答案:

答案 0 :(得分:7)

执行此操作的一种方法是定义转换运算符:

struct fraction
{
  size_t numerator;
  size_t denominator;

  operator float() const
  {
     return ((float)numerator)/denominator;
  }
};

大多数人不愿意将隐式转换运算符定义为样式。这是因为转换操作符倾向于“幕后”,并且很难判断正在使用哪些转换。

struct fraction
{
  size_t numerator;
  size_t denominator;

  float as_float() const
  {
     return ((float)numerator)/denominator;
  }
};

在此版本中,您可以调用as_float方法来获得相同的结果。

答案 1 :(得分:3)

赋值运算符和转换构造函数用于从其他类的对象初始化 类的对象。您需要一种方法来使用类的对象初始化其他类型的对象。这就是转换运算符的用途:

struct fraction {
     //other members here...
     operator double() const { return (double)numerator / denominator;}
     //other members here...
};

答案 2 :(得分:2)

您可以使用operator double进行转换:

struct fraction
{
     operator double() const
      {
         //remember to check for  denominator to 0
          return (double)numerator/denominator;
      }
};

答案 3 :(得分:1)

operator=与此无关,而是您希望向struct公众operator double添加以下内容:

operator double() {
  return ((double) numerator))/denominator;
}

答案 4 :(得分:0)

由于编译器没有如何将struct fraction转换为double,因此编译器会出现错误。如果要提供转换,则必须定义编译器将用于此转换的operator double()