一、运算符重载
定义格式:
operator 运算符 ();
说明:
1. 运算符重载是通过创建运算符函数operator()来实现的;
2. 函数operator()可以是它将要操作的类的成员,也可以不是类的成员,但非成员operator()函数通常是类的友元函数;
3. 一般来讲,运算符重载的功能应当与原有的功能相类似;
4. C++语言中只能重载原先已有定义的运算符;
5. 下列运算符不能被重载: 类属关系运算符“ . ”, 成员指针运算符“ * ”, 作用域分辨符“ :: ”, sizeof运算符和
三目运算符“ ?: ”;
6. 不能改变运算符的操作个数、原有的优先级、原有的结合特性、对预定义类型数据的操作方式;
7. 运算符重载函数operator运算符()可以返回任何类型,甚至可以是void类型,但通常返回类型与它所操作的类的类型相
同,这样可使重载运算符用在复杂的表达式中;
8. c++编译器根据参数的个数和类型来决定调用哪个重载函数,因此可为同一个运算符定义几个运算符重载函数来进行不同的
操作。
二、友元运算符函数
类内部声明格式:
friend 返回类型 operator 运算符(形参表);
类外部定义格式:
返回类型 operator 运算符(形参表)
{
函数体
}
双目运算符友元函数调用方法:
对象1名 运算符 对象2名; //隐式调用 或 operator 运算符 (对象1名,对象2名); //显式调用
单目运算符友元函数调用方法:
运算符 对象名; //隐式调用 或 operator 运算符 (对象名); //显式调用
说明:
1. 若友元运算符函数重载的是双目运算符,则参数表中有两个操作数;若重载的是单目运算符,则参数表中只有一个操
作数;
2. 有时,在函数返回的时候,可以直接用类的构造函数来生成一个临时对象,而不对该对象进行命名;
3. 友元函数没有this指针,不能引用this指针所指的对象;这个函数采用对象参数通过传值的方法传递参数的;
4. 不能用友元函数重载的运算符是: =, (), [], -> ;
例子:
程序结果:
com1 + com2 = 8-6i
com1 - com2 = -2 + 14i
com1 * com2 = 55-10i
com1 / com2 = -1-2i
++com1 = 4 + 5i
三、成员运算符函数
类内部声明格式:
返回类型 operator 运算符 (形参表);
类外部定义格式:
返回类型 类名::operator 运算符 (形参表)
{
函数体
}
双目运算符成员函数调用方法:
对象1名 运算符 对象2名; //隐式调用 或 对象1名.operator 运算符 (对象2名); //显式调用
单目运算符成员函数调用方法:
运算符 对象名; //隐式调用 或 对象名.operator 运算符 (); //显式调用
说明:
1. 在成员运算符函数的形参表中,若运算符是单目的,则参数表为空;若运算符是双目运算符,则参数表中有一个操作数;
2. 对双目运算符成员函数,其形参表中的参数作为运算符的右操作数,此时当前对象作为运算符的左操作数,它是通过this指
针隐含地传递给函数的。
例子:
程序结果:
real1 = 4.4 imag1 = 6.6
real2 = 4.4 imag2 = 6.6
real1 = 2.1 imag1 = 3.2
real2 = 3.1 imag2 = 4.2