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

Car*_*arl 1 c++ operator-overloading

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

struct fraction {
    fraction( size_t num, size_t denom ) : 
        numerator( num ), denominator( denom )
    {};
    size_t numerator;
    size_t denominator;
};
Run Code Online (Sandbox Code Playgroud)

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

fraction f(3,5);
...
double v = f; 
Run Code Online (Sandbox Code Playgroud)

v现持有我的分数所代表的价值.我将如何在C++中执行此操作?

180*_*ION 7

一种方法是定义转换运算符:

struct fraction
{
  size_t numerator;
  size_t denominator;

  operator float() const
  {
     return ((float)numerator)/denominator;
  }
};
Run Code Online (Sandbox Code Playgroud)

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

struct fraction
{
  size_t numerator;
  size_t denominator;

  float as_float() const
  {
     return ((float)numerator)/denominator;
  }
};
Run Code Online (Sandbox Code Playgroud)

在此版本中,您将调用该as_float方法以获得相同的结果.

  • 另外,使用static_cast :) (3认同)
  • 我相信你可以使用"显式操作符float()const"来使强制转换仅在显式时起作用,而不能用于幕后的恶作剧.然后你必须说"double myDouble = static_cast <float>(myFraction);" 或同等学历.(实际上,只是用Google搜索,看起来它只是C++ 0x中的标准.我使用过的大多数编译器已经支持它了一段时间.) (2认同)