【发布时间】:2010-12-09 02:59:26
【问题描述】:
我有一个封装了一些算术的类,比如说定点计算。我喜欢重载算术运算符的想法,所以我写了以下内容:
class CFixed
{
CFixed( int );
CFixed( float );
};
CFixed operator* ( const CFixed& a, const CFixed& b )
{ ... }
一切正常。我可以写 3 * CFixed(0) 和 CFixed(3) * 10.0f。但现在我意识到,我可以更有效地使用整数操作数来实现 operator*。所以我重载它:
CFixed operator* ( const CFixed& a, int b )
{ ... }
CFixed operator* ( int a, const CFixed& b )
{ ... }
它仍然有效,但现在 CFixed(0) * 10.0f 调用重载版本,将 float 转换为 int (我希望它将 float 转换为 CFixed )。当然,我也可以重载浮点版本,但这对我来说似乎是代码的组合爆炸。是否有任何解决方法(或者我的课程设计错误)?如何告诉编译器仅使用整数调用重载版本的 operator*?
【问题讨论】:
-
我不相信你可以。
-
另一方面,采用单个参数(更何况是内置参数)的构造函数可能应该被声明为显式,这当然会阻止提升......但也可以防止错误。跨度>
-
另一个“显式”倡导者 =) 隐式构造函数很有帮助,前提是您意识到它们在做什么。设计一个函数,接受 CFixed 参数并在那里传递整数真是太好了!
标签: c++ operator-overloading implicit-conversion