9.2运算符函数参数 》运算符+和-~有前置运算和后置运算两种运算形式,重 载时必须使用不同的函数原型加以区分。 ÷将后置运算重载为返回右值的双目运算符函数: 如果重载为类的普通函数成员,则该函数只需定义 一个int类型的参数;(包含不用const修饰的this参数) 如果重载为普通函数(C函数),则最好声明不用const 引用类的和int类型的两个参数。(无this参数) 冬将前置运算重载为返回左值的单目运算符函数: 前置运算是先运算再取值,运算结果为左值,因此 其返回类型应该定义为非只读类型的引用类型 g 如果重载为普通函数(C函数),则最好声明不用const 的引用类的一个参数。(无this参数) 17
17 9.2 运算符函数参数 运算符++和--有前置运算和后置运算两种运算形式,重 载时必须使用不同的函数原型加以区分。 将后置运算重载为返回右值的双目运算符函数: ) 如果重载为类的普通函数成员,则该函数只需定义 一个int类型的参数;(包含不用const修饰的this参数) ) 如果重载为普通函数(C函数),则最好声明不用const 引用类的和int类型的两个参数。(无this参数) 将前置运算重载为返回左值的单目运算符函数: ) 前置运算是先运算再取值,运算结果为左值,因此 其返回类型应该定义为非只读类型的引用类型。 ) 如果重载为普通函数(C函数),则最好声明不用const 的引用类的一个参数。(无this参数)
9.2运算符函数参数 无论是前置运算还是后置运算,运算符++和-都会改变 对象的值,在重载时,最好将与该对象相应的参数定义 为非只读引用类型,以便函数返回时能通过换名变量带 回执行结果 【例9.4】重载运算符++和-运算。 #include <iostream.h> int get(){return a; class A A&operator+-+()月 int a; /只有this,返回左值,前置运算 friend A &operator--(A&); ∥仅一左值参数,返左值, 前置运算 A operator++(int); ∥包括this共两个参数,为后置运算 friend A operator--(A&,int); A(int x){a=x; /两个参数,为后置运算 public: } 18
18 9.2 运算符函数参数 无论是前置运算还是后置运算,运算符++ 和--都会改变 对象的值,在重载时,最好将与该对象相应的参数定义 为非只读引用类型,以便函数返回时能通过换名变量带 回执行结果。 【例9.4】重载运算符++ 和--运算。 #include <iostream.h> class A{ int a; friend A &operator--(A&); //仅一左值参数,返左值,前置运算 friend A operator--(A&,int); //两个参数,为后置运算 public: int get( ) { return a; } A &operator++( ); //只有this,返回左值,前置运算 A operator++(int); //包括this共两个参数,为后置运算 A(int x) { a=x; } };
9.2运算符函数参数 A&operator-(A&x){/前置-,操作数x左值,返回引用对象(左值) X.a--; /先运算后取值,返回左值可连续运算 return x; A operator--(A&x,int) ∥后置-,操作数x左值引用,返回右值对象 {/W后置运算先取值x.a, 构造的常量A(x.a)做右值返回, ∥后置运算后运算,x.a-响当前操作数x,返回时当前对象x被修改 return A(x.a--); ∥先取值后运算,返回右值不可连续运算 } A &A::operator+() /前置+,his无const修饰,返回左值引用对象 前置运算结果的左值等于当前对象,且返回的引用应为当前对象, /以便连续运算,不能引用局部对象,故必须用return*this返回 a++, /前置++,先运算,后取值返回 return *this; /返回值为当前对象的引用,左值可连续运算 } 19
19 9.2 运算符函数参数 A &operator--(A&x) { //前置--,操作数x左值,返回引用对象(左值) x.a--; //先运算后取值,返回左值可连续运算 return x; } A operator--(A&x, int) //后置--,操作数x左值引用,返回右值对象 {//后置运算先取值x.a,构造的常量A(x.a)做右值返回, //后置运算后运算,x.a--响当前操作数x,返回时当前对象x被修改 return A(x.a--); //先取值后运算,返回右值不可连续运算 } A &A::operator++( ) //前置++,this无const修饰,返回左值引用对象 {//前置运算结果的左值等于当前对象,且返回的引用应为当前对象, //以便连续运算,不能引用局部对象,故必须用return *this返回 a++; //前置++,先运算,后取值返回 return *this; //返回值为当前对象的引用,左值可连续运算 }
9.2运算符函数参数 AA::operator++(int){ ∥后置++,返回对象(右值) return A(a++); 后置+,先取值构造,后运算 void main(void){ Aa(5); cout<<"a.a="<<(--a).get()<<"\n"; 输出: a.a=4 cout<<"a.a="<<(++a).get()<<"\n"; a.a=5 cout<"a.a="<<(a-)get()<"\n"; a.a=5 a.a=4 cout<<"a.a-"<<(a++).get()<<"\n"; } 20
20 9.2 运算符函数参数 A A::operator++(int){ //后置++,返回对象(右值) return A (a++); //后置++,先取值构造,后运算 } void main(void){ A a(5); cout<<"a.a="<<(--a).get( )<<"\n"; cout<<"a.a="<<(++a).get( )<<"\n"; cout<<"a.a="<<(a--).get( )<<"\n"; cout<<"a.a="<<(a++).get( )<<"\n"; } 输出: a.a=4 a.a=5 a.a=5 a.a=4
9.2运算符函数参数 重载双目运算符->: 只能重载为有一个参数,且返回类型必须为指针或 引用类型的普通函数成员。 ”该运算符是唯一可以重载为单目运算的纯双目运算 符。 【例9.5】重载运算符->,使其返回类型为指针类型。 struct A{ A x; int a; public: A(int x){a-x; A*operator->()月 }; B(int v):x(v)} class B{ }; 21
21 9.2 运算符函数参数 重载双目运算符–>: ) 只能重载为有一个参数,且返回类型必须为指针或 引用类型的普通函数成员。 ) 该运算符是唯一可以重载为单目运算的纯双目运算 符。 【例9.5】重载运算符–>,使其返回类型为指针类型。 struct A{ int a; A(int x) { a=x; } }; class B{ A x; public: A *operator –>( ); B(int v):x(v) { } };