Item 24: Declare non-member functions when type conversions should apply all parameters.
令 classes
支持隐式转换通常是糟糕的设计,但也有例外,最常见的是在建立数值类型时。 比如设计一个有理数 class
允许整数隐式转换。
1 | class Rational { |
这时我们想设计一个乘法,该使用 member
函数,还是 non-member
函数, 还是 non-member-friend
函数?
我们先采用 member
函数看有什么问题?
1 | class Rational { |
我们使用如下没有什么问题:
1 | Rational oneEighth(1, 8); |
但当我们想支持混合运算,那 Rational
和 ints
相乘, 就只有一半行的通。
1 | result = oneHalf * 2; //ok 隐式转换 |
当我们设计成 non-member
函数就都支持:
1 | class Rational { |
1 | Rational oneFourth(1, 4); |
如果需要为某个函数的所有参数进行类型转换,那这个函数必须是 non-member