9.1概述 运算符重载约定(续): 云若运算符为左值运算符,则重载后运算符 函数最好返回非只读引用类型; 重载为普通函数(C函数)的运算符可以声明 为类的普通友元: 重载不改变运算符的优先级和结合性; 重载一般也不改变运算符的操作数个数。 (特殊的运算符除外:->,++,一) 12
12 9.1 概述 运算符重载约定(续): )若运算符为左值运算符,则重载后运算符 函数最好返回非只读引用类型; )重载为普通函数(C函数)的运算符可以声明 为类的普通友元; )重载不改变运算符的优先级和结合性; )重载一般也不改变运算符的操作数个数。 (特殊的运算符除外:->, ++, --)
9.1概述 【例9.3】重载运算符为普通函数并声明为类的普通友元。 class A int x,y, public: A(int x,int y){A::x=x;A::y=y; A &operator-(A); /等号运算符重载为左值运算符 friend A operator-(A); friend A operator+(const A &const A &) }; A operator-(A a){ ∥重载为单目运算符(右值) return A(-a.x,-a.y); IA(-a.x,-a.y)为A类常量对象 A &A::operator=(A y){ his指向等号左边的操作数(左值) 13
13 9.1 概述 【例9.3】重载运算符为普通函数并声明为类的普通友元。 class A{ int x, y; public: A(int x, int y) { A::x=x; A::y=y; } A &operator=(A); //等号运算符重载为左值运算符 friend A operator–(A); friend A operator+(const A &, const A &); }; A operator–(A a) { //重载为单目运算符(右值) return A(–a.x, –a.y); //A(–a.x, –a.y)为A类常量对象 } A &A::operator=(A y) { //this指向等号左边的操作数(左值)
9.1概述 A::x-y.x; A::y=y.y, return *this; /返回一个引用表示等号为左值,可连续运算(m=n)p A operator+(const A.&x,const A&y){/重载双目加法为(右)值运算符函数 int u=x.x+y.x,v-x.y+y.y; return A(u,V),∥A(xx+yx,xy+yy)为类A的常量对象 } void main(void) Aa(2,3),b(4,5),c(1,9) c-a+b; (c=a+b)=b+b;/赋值运算重载为左值,可出现在等号左边(连续运算) c=-b, } 14
14 9.1 概述 A::x=y.x; A::y=y.y; return *this; //返回一个引用表示等号为左值,可连续运算(m=n)=p } A operator +(const A&x, const A&y) {//重载双目加法为 ( 右 )值运算符函数 int u=x.x+y.x, v=x.y+y.y; return A(u, v); //A(x.x+y.x, x.y+y.y)为类 A的常量对象 } void main(void){ A a(2,3), b(4,5), c(1, 9); c=a+b; (c=a+b)=b+b; //赋值运算重载为左值,可出现在等号左边 (连续运算 ) c= –b; }
9.2运算符函数参数 冬不同的重载形式函数的参数表列出的参数个数不 同。 o 重载为普通函数: 参数个数=运算符目数 。重载为类的普通函数成员:(存在this指针) 参数个数=运算符目数·1 。重载为类的静态函数成员:(没有this指针) 参数个数=运算符目数 注意有的运算符既为单目,又为双目的:*,+, 冬对于某些特殊的运算符,其重载函数参数个数与其 目数之间可能不满足上述关系。 15
15 9.2 运算符函数参数 不同的重载形式函数的参数表列出的参数个数不 同。 ) 重载为普通函数: 参数个数 = 运算符目数 ) 重载为类的普通函数成员:(存在this指针) 参数个数 = 运算符目数 - 1 ) 重载为类的静态函数成员:(没有this指针) 参数个数 = 运算符目数 注意有的运算符既为单目,又为双目的:*, +,- 对于某些特殊的运算符,其重载函数参数个数与其 目数之间可能不满足上述关系
9.2运算符函数参数 在重载运算符函数时: 。如果函数的参数实际有两个(包括隐含 this参数),则重载的运算符函数为双目 运算符函数; 。如果函数的参数实际只有一个(包括隐含 this参数),则重载的运算符函数为单目 运算符函数。 16
16 9.2 运算符函数参数 在重载运算符函数时: )如果函数的参数实际有两个(包括隐含 this参数),则重载的运算符函数为双目 运算符函数; )如果函数的参数实际只有一个(包括隐含 this参数),则重载的运算符函数为单目 运算符函数