在C++中实现operator*

ven*_*rty 3 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

与调用成员函数的对象相对应的隐式参数 - "this"指向的对象 - 永远不能进行隐式转换.这是第一次调用编译而第二次调用没有.

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

Pup*_*ppy 5

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

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

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

  • 我稍微编辑了一下以便更明确,但它确实回答了这个问题. (2认同)