重载:一名多用
运算符的重载:
实质是函数的重载,重载函数一般格式如下:
函数类型 operator 运算符名称(形参表)
{ 对运算符的重载处理 }
C++不允许用户定义自己定义的新的运算符,只能对已有的运算符进行重载。
不能重载的运算符:
.(成员访问运算符)
*(成员指针访问运算符)
::(域运算符)
sizeof(长度运算符)
?:(条件运算符)
重载不能改变运算符对象(操作数)的个数。
重载不能改变优先级别。
重载不能改变运算符的结核性。
重载的运算符的函数不能有默认参数。
重载的运算符必须和用户自定义类型的对象一起使用,其参数至少应该有一个是类的对象(或类对象的引用)
用于类对象的运算符一般都必须重载,但是有两个例外,运算符“=”和“&”不必用户重载。但是默认的“=”运算符是浅拷贝,在数据成员中包含指向动态分配的内存指针时,在复制此成员时就会出现危险。这种情况下就需要自己重载赋值运算符。
C++规定,“=”,下标运算符“[ ]”,函数调用运算符"( )",成员运算符“->”等必须作为成员函数。
插入流“<<”和流提取运算符“>>”,类型转换运算符不能定义为类的成员函数,只能定义为友元函数。
运算符重载函数作为类成员函数和友元函数:
成员函数:C1 + C2; 编译器解释为:C1.operator+(C2); //可通过this指针自由的访问本类型的数据,因此可以少写一个函数的参数
友元函数:C1 + C2; 编译器解释为:operator+(C1,C2);
++和--(单目)运算符的重载:
C++约定,在自增,自减运算符重载函数中,增加一个int型的参数,就是后置自增,自减运算符函数。
如:Time operator++(int ){ ... }
重载插入流运算符和流提取运算符:
istream &operator>>(istream &,自定义类 &);
ostream &operator<<(ostream &,自定义类 &);
重载运算符“>>”的函数的第一个参数和函数的类型都必须是istream&类(即istream类对象的引用)。
重载运算符“<<”的函数的第一个参数和函数的类型都必须是ostream&类(即ostream类对象的引用)。
注意在重载函数内要把插入流和输出流的现状范围,即保留输出流、插入流的现状。否则不能连续的输出和插入信息。
如:cout << variable1 << variable2 ;
cout << variable; 解释为:operator<<(cout , variable);
不同类型数据间的转换:
转换构造函数:
将其他类型的一个数据转换成一个类的对象。转换构造函数只有一个形参。如果有多个参数,就不是转换构造函数。
如:Complex( double r){ real = r; imag = 0; }
Complex( 2.3 ); //进行类型转换
类型转换函数(类型转换运算符重载函数):
将一个类的对象转换成另一类的数据。
如:operator double( ){ return real; }
在函数名前面不能指定函数类型,函数没有参数。其返回值的类型是由函数名中指定的类型名来指定的。
类型转换函数只能作为成员函数,因为转换的主体是本类的对象,不能作为友元函数或者普通函数。
在定义了类型转换函数后系统会在程序的表达式中自动检测是否需要进行类型转换。
如:double d;Complex v1;
d= v1 + 2.2;
当用户没有对“+”进行重载的时候,系统就可以把v1自动转换为double类型的数据后,再进行运算。
如果运算符重载为成员函数,它的第一个参数必须是本类的对象。当第一个操作数不是类对象时,不能将运算符函数重载为成员函数。如果将运算符重载函数重载为类的成员函数,交换律不适用。
在定义转换构造函数和类型转换运算符重载函数时,必须注意不要引起二义性。