在C ++中实现operator *

时间:2011-01-22 11:00:33

标签: c++

class Rational {

 const Rational operator*(const Rational& rhs) const

  ...
};

 Rational oneHalf(1,2);

 Rational result = oneHalf * 2;   // fine (with non-explicit ctor)
 result          = 2 * oneHalf;  // error! (even with non-explicit ctor)

scott meyers在Effective C ++的书中提到了如下

即使Rationl的构造函数不明确,一个编译,一个不编译。原因如下:

事实证明,只有当参数列在参数列表中时,参数才有资格进行隐式转换。

对应于调用成员函数的对象的隐式参数 - “this”指向的那个 - 是  永远不符合隐式转换的条件。这是第一次调用编译而第二次调用没有。

我的问题是作者在上述声明中的含义“只有它们列在参数列表中”?什么是参数列表?

3 个答案:

答案 0 :(得分:5)

编写运算符时,请尝试根据显式函数调用来考虑它。

Rational oneHalf(1, 2);
Rational result = oneHalf.multiply(2); // Ok, can convert
Rational result = 2.multiply(oneHalf); // OWAIT, no such function on int.

由于int上没有这样的运算符,编译器不知道如何处理oneHalf以使调用工作,并抛出错误。在这种情况下,“参数列表”是运算符的参数。你需要做一个免费的功能。

答案 1 :(得分:0)

他的意思是可以隐式转换函数参数,但是永远不会隐式转换为函数形成*this的东西。

答案 2 :(得分:0)

  

我的问题是作者的意思   在上述声明中“只有他们是   在参数列表中列出“?什么   是参数列表?

他的意思是构造函数中的参数列表:

class Rational
{
  public:
     Rational (int a);  // <-- here 'a'
     Rational (double b); //<-- here 'b'
};

如果您的班级中有这两个构造函数,那么您可以编写

Rational result1 = oneHalf * 2; //2 is int, so it converts into Rational(2)
Rational result2 = oneHalf * 2.9; //2.9 is double, so it converts into Rational(2.9)
相关问题