《运算符重载.ppt》由会员分享,可在线阅读,更多相关《运算符重载.ppt(151页珍藏版)》请在三一文库上搜索。
1、运算符重载使得用户自定义的数据可以以一种简洁的式子来表示运算。,例如: int x , y, z ; z = x + y ;,matrix m1 , m2 ,m3; / 矩阵类对象 m3 = Madd ( m1 , m2 ) ; / 调用函数计算两个矩阵的和,complex c1 , c2, c3 ; / 复数类对象 c3 = Cadd (c1 , c2 ) ; / 调用函数计算两个复数的和,c3 = c1 + c2 ; ?,能表示为 m3 = m1 + m2 ; ?,第7章 运算符重载,定义运算对象类和 运算符重载函数,所谓运算符重载是对已有的运算符赋予多重的含义,使得同一个运算符可以进行相
2、同类型数据的指定运算,从而得到不同的运算结果。,7.1 运算符重载规则,7.1.1 重载运算符的限制,可以重载的运算符 + - * / % & | ! = += -= *= /= %= = &= |= = = & | + - -* - () new delete new delete,不能重载的算符 . : * ?: #,重载运算符函数可以对运算符作出新的解释,但原有基本语义不变: 运算符的优先级不变。 例如:C1+C2*C3等价于C1+(C2*C3) 运算符的结合性不变。 例如:C1+C2+C3等价于(C1+C2)+C3 运算符所需要的操作数不变。 例如:C1+C2 注意:不能创建新的运算符
3、进行重载。,7.1.2 运算符重载的语法形式,运算符函数是一种特殊的成员函数或友员函数。,重载运算符函数是成员函数时,语法形式为: 类型 类名 : operator op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,重载运算符函数是成员函数时,语法形式为: 类型 类名 : operator op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,函数返回类型,重载运算符函数是成员函数时,语法形式为: 类型 类名 : operator op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,重载该运算符的类,重载运算符函数是成员函数时,语法形式为: 类型 类名 : operat
4、or op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,被重载的运算符,重载运算符函数是成员函数时,语法形式为: 类型 类名 : operator op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,关键字,重载运算符函数是成员函数时,语法形式为: 类型 类名 : operator op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,函数名,重载运算符函数是成员函数时,语法形式为: 类型 类名 : operator op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,运算符要求的操作数,重载运算符函数是成员函数时,语法形式为: 类型 类名 : operator
5、 op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,重载运算符函数是友元函数时,语法形式为: friend 类型 operator op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,重载运算符函数是友员函数时,语法形式为: friend 类型 operator op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,函数返回类型,重载运算符函数是友员函数时,语法形式为: friend 类型 operator op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,关键字,重载运算符函数是友员函数时,语法形式为: friend 类型 operator op ( 参数表
6、 ) 函数体; / 相对于该类定义的操作 ,被重载的运算符,重载运算符函数是友员函数时,语法形式为: friend 类型 operator op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,关键字,重载运算符函数是友员函数时,语法形式为: friend 类型 operator op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,函数名,重载运算符函数是友员函数时,语法形式为: friend 类型 operator op ( 参数表 ) 函数体; / 相对于该类定义的操作 ,运算符要求的操作数,重载运算符函数是友员函数时,语法形式为: friend 类型 operator op
7、 ( 参数表 ) 函数体; / 相对于该类定义的操作 ,一个运算符被重载后,原有意义没有失去,只是定义了相对于某一特定类的一个新运算符。 运算符重载有两种调用方式:一种是象调用普通函数那样的方式;另一种是使用重载运算符调用的方式。,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int
8、value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned i
9、nt Calculator:operator() () return value ; ,设计一个安全计数器,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ;
10、i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,重载了 3个算符
11、,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter()
12、; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,重载了 3个算符,#include #include using namespace std; class Calcula
13、tor public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Count
14、er = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,void Calculator : operator + () if ( value 65535 ) value + ; else cout “nData overflow !“ endl ; abort() ; ,#inclu
15、de #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for(
16、i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,void Calculator : operator + () if ( value 65535 ) value + ; else co
17、ut “nData overflow !“ endl ; abort() ; ,使用 系统预定义版本,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5
18、 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,void Calcul
19、ator : operator - () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; ,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Ca
20、lculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator
21、() () return value ; ,设计一个安全计数器,void Calculator : operator - () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; ,使用 系统预定义版本,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operat
22、or() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflo
23、w !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,+ Counter;,调用重载版本,void operator + () ;,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsi
24、gned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; u
25、nsigned int Calculator:operator() () return value ; ,设计一个安全计数器,+ Counter;,void operator + () ;,调用重载版本,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int m
26、ain() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:
27、operator() () return value ; ,设计一个安全计数器,void operator + () ;,调用重载版本,Counter.operator+() ;,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calcul
28、ator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() (
29、) return value ; ,设计一个安全计数器,- Counter;,调用重载版本,void operator - () ;,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ;
30、for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安
31、全计数器,- Counter;,调用重载版本,void operator - () ;,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i +
32、) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,调用重载版本,void operat
33、or - () ;,Counter.operator-() ;,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter;
34、 cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,Counter () ;,调用重载版本,void opera
35、tor () () ;,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “
36、 Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,Counter () ;,void operator () () ;,被重载的运算符,#includ
37、e #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i
38、 = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,Counter () ;,void operator () () ;,函数参数表,Counter. operator() () ;,#in
39、clude #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; fo
40、r( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,#include #include using namespace std; class Calculator public: C
41、alculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counte
42、r() ; ,void Calculator:operator + () if ( value 0 ) value - ; else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,#include #include using namespace std; class Calculator public: Calculator() value = 0 ; ; void operator + () ; void operator -
43、 () ; unsigned int operator() () ; private: unsigned int value; ; int main() Calculator Counter ; int i ; for( i = 0 ; i 5 ; i + ) + Counter; cout “n Counter = “ Counter() ; for( i = 0 ; i = 5 ; i + ) - Counter; cout “n Counter = “ Counter() ; ,void Calculator:operator + () if ( value 0 ) value - ;
44、else cout “n Data overflow !“ endl ; abort() ; unsigned int Calculator:operator() () return value ; ,设计一个安全计数器,用于类运算的运算符通常都要重载。但有两个运算符“=”和“&”例外,系统提供了默认重载版本。 赋值运算符“=”,系统默认重载为对象数据成员的复制; 地址运算符“&”系统默认重载为返回任何类对象的地址。,可以重载的运算符有些是一元运算符,有些是二元运算符,重载这些运算符时究竟是用成员函数还是友员函数?,7.2 用成员或友员函数重载运算符,重载为成员函数,解释为: Object .
45、 operator op () 操作数由对象Object通过this指针隐含传递。 重载为友员函数,解释为: operator op (Object) 操作数由参数表的参数Object提供 。,1一元运算符,Object op 或 op Object,重载为成员函数,解释为: ObjectL . operator op ( ObjectR ) 左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递。 重载为友员函数,解释为: operator op ( ObjectL, ObjectR ) 左右操作数都由参数传递。,2二元运算符,ObjectL op ObjectR,当
46、一元运算符的操作数,或者二元运算符的左操作数是该类的一个对象时,定义重载算符函数为成员函数。,7.2.1 用成员函数重载运算符,例7-2 建立一个描述3维坐标的类TnCoor,重载运算符“+”、“+”和“=”,以便实现简单的算术运算。, class TriCoor public: TriCoor( int mx = 0, int my = 0, int mz = 0 ) x = mx ; y = my ; z = mz ; TriCoor operator + ( TriCoor t ) TriCoor temp ; temp.x = x+t.x ; temp.y = y+t.y ; temp.z = z+t.z ; return temp ; TriCoor operator = ( TriCoor t ) x = t.x ; y = t.y ; z = t.z ; return * this ; TriCoor operator + () x + ; y + ; z + ; return *this ; void show() cout x “ , “