第四周 运算符重载
1.运算符重载的基本概念
2.赋值运算符的重载
3.运算符重载为友元函数
4.运算符重载实例:可变长数组类的实现
5.流插入运算符和流提取运算符的重载
6.类型转换运算符、自增自减运算符的重载
1.运算符重载的基本概念
运算符重载的需求
C++预定义的运算符,只能用于基本数据类型的运算:整型、实型、字符型、逻辑型
+、-、*、/、%、^、&、~、!、|、=、<<、>>、!=、……
在数学上,两个复数可以直接进行+、-等运算。但在C++中,直接将+或-用于复数对象是不允许的。
有时会希望,让对象也能通过运算符进行运算。这样代码更简洁,容易理解。
例如:complex_a和complex_b是两个复数对象,求两个复数的和, 希望能直接写:complex_a + complex_b
运算符重载
运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为。
运算符重载的目的是:扩展C++中提供的运算符的适用范围,使之能作用于对象。
同一个运算符,对不同类型的操作数,所发生的行为不同。
complex_a + complex_b 生成新的复数对象
5 + 4 = 9
运算符重载的形式
运算符重载的实质是函数重载
可以重载为普通函数,也可以重载为成员函数
把含运算符的表达式转换成对运算符函数的调用。
把运算符的操作数转换成运算符函数的参数。
运算符被多次重载时,根据实参的类型决定调用哪个运算符函数。
重载为成员函数时 , 参数个数为运算符目数减一,作用于当前对象 。
重载为普通函数时 , 参数个数为运算符目数 ,作用于运算符两侧的对象。
运算符重载的形式
返回值类型 operator 运算符(形参表)
{
……
}
例子:
class Complex
{
public:
double real,imag;
Complex( double r = 0.0, double i= 0.0 ):real(r),imag(i) { }
Complex operator-(const Complex & c);
};
Complex operator+( const Complex & a, const Complex & b)//重载为普通全局函数
{
return Complex( a.real+b.real,a.imag+b.imag); // 返回一个临时对象
}
Complex Complex::operator-(const Complex & c)//重载为成员函数
{
return Complex(real - c.real, imag - c.imag); // 返回一个临时对象
}
int main()
{
Complex a(4,4),b(1,1),c;
c = a + b; // 等价于c=operator+(a,b);
cout << c.real << "," << c.imag << endl;
cout << (a-b).real << "," << (a-b).imag << endl;
//a-b 等价于a.operator-(b)
return 0;
}
输出:
5,5
3,3
//c = a + b; 等价于c=operator+(a,b);
//a-b 等价于a.operator-(b)