众所周知,C++允许使用操作符重载,从而使类与类、类与常量直接相加,简化写法。
而操作符重载跟使用的顺序有关,并不是那么简单的,比如a是一个类,如果你只定义了成员操作符重载函数,则写成a+1没有问题,写成1+a就会报错了,这个问题有两种解决方式:
1.使用类的 构造转换函数
假设我们定义了一个Complex类
class Complex
{
private:
int rel;//实部
int img;//虚部
public:
Complex(int n):rel(n),img(0){
}//构造转换函数
........
}
那么如果有类的构造转换函数,就可以支持这种写法
Complex a;
a=2;
注意,这里先调用构造转换函数,隐式地将2转换为了Complex类,然后再拷贝给a。
要进行这种隐式的转换是有条件的:
要么构造转换函数只有一个参数。
Complex(int n)
要么有多个参数,但从第二个开始给每个参数设置默认值
Complex(int n,int a=1,int b=2,......)
总之,这种隐式的转换看似方便,但也会带来很多问题,所以C++提供了explicit关键字用来关闭这种隐式转换:
explicit Complex(int n)
这样写,就只能显式的调用了
a=Complex(2);
接下来回归主题,有了这种构造转换函数,就可以轻松实现类与基本类型的相加,只要再定义一个友元类的操作符重载函数:
class Complex
}
private:
int rel;//实部
int img;//虚部
public:
Complex(int n):rel(n),img(0