第9章运算符重载 本章内容: ■9.1概述 ■9.2运算符函数参数 ■9.3赋值与调用 ■9.4强制类型转换 ■9.5重载new和delete ■9.6表运算实例 2
2 第9章 运算符重载 本章内容: 9.1 概述 9.2 运算符函数参数 9.3 赋值与调用 9.4 强制类型转换 9.5 重载new和delete 9.6 表运算实例
9.1 概述 运算符:也称为运算符函数,运算符的操作数则相当 于函数的参数。 C++根据操作数个数的不同将运算符分为单目、双目 和三目运算符: 纯单目运算符,只能有一个操作数,包括: I、~、sizeof、new、delete等 。纯双目运算符,只能有两个操作数,包括: []、>、%、=等 。三目运算符,有三个操作数,包括: ?: ©既是单目又是双目的运算符,包括: 十、-、&、*等 3
3 9.1 概述 运算符:也称为运算符函数,运算符的操作数则相当 于函数的参数。 C++根据操作数个数的不同将运算符分为单目、双目 和三目运算符: ) 纯单目运算符,只能有一个操作数,包括: !、~、sizeof、new、delete 等 ) 纯双目运算符,只能有两个操作数,包括: [ ]、->、%、= 等 ) 三目运算符,有三个操作数,包括: ?: ) 既是单目又是双目的运算符,包括: +、-、&、* 等
9.1概述 左值运算符:是运算结果为左值的运算符。 其构成的表达式可以出现在等号左边。如前 置运算++、-以及赋值运算=、+=、*=和&= 等均为左值运算符。 冬某些运算符要求操作数为左值,如前置运算 ++和-。 还有一些运算符要求第一个操作数为左值, 如赋值运算=、+=、*=和&=等。 4
4 9.1 概述 左值运算符:是运算结果为左值的运算符。 其构成的表达式可以出现在等号左边。如前 置运算++、--以及赋值运算=、+=、*=和&= 等均为左值运算符。 某些运算符要求操作数为左值,如前置运算 ++和--。 还有一些运算符要求第一个操作数为左值, 如赋值运算=、+=、*=和&=等
9.1概述 【例9.1】左值运算符的用法。 void main(void) int x=0; ++X, ++++X ∥++x仍为左值,故可连续运算,x=3 -X=10; ∥-x仍为左值,故可再次赋值,x=10 (x=5)=12,x=5仍为左值,故可再次赋值,x=12 (x+=5)=7;x+=5仍为左值,故可再次赋值,x=7 } 5
5 9.1 概述 【例9.1】左值运算符的用法。 void main(void) { int x=0; ++x; ++ ++x; //++x仍为左值,故可连续运算,x=3 --x=10; //--x仍为左值,故可再次赋值,x=10 (x=5)=12; //x=5仍为左值,故可再次赋值,x=12 (x+=5)=7; //x+=5仍为左值,故可再次赋值,x=7 }
概述 运算符重载:将运算符看成是预定义的关于简单类型 的运算函数,运算符重载就是对这些函数进行的关于 类的对象的运算的重载。 运算符重载:用关键字operator加上参数(主要是)参数 类型的不同来说明重载。 冬【例9.2】将加法运算符重载为普通函数。 #include class A{ int x; public: int getx const{return x; A(int x)A::x=x; }; 6
6 9.1 概述 运算符重载:将运算符看成是预定义的关于简单类型 的运算函数,运算符重载就是对这些函数进行的关于 类的对象的运算的重载。 运算符重载:用关键字operator加上参数(主要是)参数 类型的不同来说明重载。 【例9.2】将加法运算符重载为普通函数。 #include class A{ int x; public: int getx () const{ return x; } A(int x) { A::x=x; } };
9.1 概述 int operator+(const A &x,int y){return x.getx(+y; int operator+(int y,A x){return x.getxO)+y; void main(void) 必须有关于类的对象 Aa(6), cout<"a+7="<<a+7<<"\n"; /调用int operator+(const A&,int) cout<<"8+a="<<8+a<<"n", /调用int operator+-(int,A) } 输出: a+7=13 8+a=14 7
7 9.1 概述 int operator+(const A &x, int y){ return x.getx()+y; } int operator+(int y, A x){ return x.getx()+y; } void main(void) { A a(6); cout<<"a+7="<<a+7<<"\n"; //调用int operator+(const A&, int) cout<<"8+a="<<8+a<<"\n"; //调用int operator+(int, A) } 输出: a+7=13 8+a=14 必须有关于类的对象
9.1概述 根据能否重载及重载的函数类型,可将运算符分为: 。不能重载的运算符: sizeof、.、.*、:、?: 。只能重载为普通函数成员的运算符: =、->、0、0 。不能重载为普通函数成员的运算符: new、delete 。其他运算符:都不能重载为静态函数成员,但可 以重载为普通函数成员和普通函数。 8
8 9.1 概述 根据能否重载及重载的函数类型,可将运算符分为: ) 不能重载的运算符: sizeof、. 、.*、::、? : ) 只能重载为普通函数成员的运算符: =、–>、()、[] ) 不能重载为普通函数成员的运算符: new、delete ) 其他运算符:都不能重载为静态函数成员,但可 以重载为普通函数成员和普通函数
9.1概述 运算符=、->、()和[不能重载为普通函数,没有普通 函数也就不能定义普通友元: int operator=(int,A); /错误,不能重载为普通函数 int operator()(A,int); 错误,不能重载为普通函数 int operator[1(A,int); /错误,不能重载为普通函数 class Af friend int operator=(int,A); 错误,不能定义为普通友元 friend int operatorO(A,int); /错误,不能定义为普通友元 friend int operator[](A,int); 错误,不能定义为普通友元 friend int operator+=(int,A); 正确 }; 9
9 9.1 概述 运算符=、–>、( )和[ ]不能重载为普通函数,没有普通 函数也就不能定义普通友元: int operator=(int, A); //错误,不能重载为普通函数 int operator( )(A, int); //错误,不能重载为普通函数 int operator[ ](A, int); //错误,不能重载为普通函数 class A{ friend int operator=(int,A); //错误,不能定义为普通友元 friend int operator()(A,int); //错误,不能定义为普通友元 friend int operator[](A,int); //错误,不能定义为普通友元 friend int operator += (int,A); //正确 };
9.1概述 运算符=、->、()和川也不能重载为静态函数成员,因 此,不能在类中声明或定义如下静态函数成员: class B{ static int operator+=(int,B);∥错误,不能定义为静态函数成员 static int operator=(int,B); /错误,不能定义为静态函数成员 static int operator()(B,int); /错误,不能定义为静态函数成员 static int operator[](B,int); ∥错误,不能定义为静态函数成员 static operator int(B); /错误,不能定义为静态函数成员 }; 10
10 9.1 概述 运算符=、–>、( )和[]也不能重载为静态函数成员,因 此,不能在类中声明或定义如下静态函数成员: class B{ static int operator+=(int, B); //错误,不能定义为静态函数成员 static int operator=(int, B); //错误,不能定义为静态函数成员 static int operator( )(B, int); //错误,不能定义为静态函数成员 static int operator[ ](B, int); //错误,不能定义为静态函数成员 static operator int(B); //错误,不能定义为静态函数成员 };
9.1概述 运算符重载约定:关于单个对象的运算 将运算符函数重载为普通函数(C函数)时, 参数中至少要有一个类或类的引用类型: int operator+(int,A); 正确 int operator+-(const A&,int);/正确 不能将重载运算符函数的参数类型定义为 对象指针(简单类型)或者对象数组类型; int operator+(A *int); /错误 int operator+(A[6],int); 1/错误 11
11 9.1 概述 运算符重载约定:关于单个对象的运算 )将运算符函数重载为普通函数(C函数)时, 参数中至少要有一个类或类的引用类型; int operator+(int, A); //正确 int operator+(const A&, int); //正确 )不能将重载运算符函数的参数类型定义为 对象指针(简单类型)或者对象数组类型; int operator+(A *, int); //错误 int operator+(A[6], int); //错误