3.单目运算符重载 用友元函数重载单目运算符时,需要一个显式的操作数。 例5.6用友元函数重载单目运算符“-” mian( Include<iostream.h> class classi I nclass ob1(10,20)2ob2; int a. b: ob1.showo public ob2=-ob1 nclass(int x=0, int y=0)(a=x; b=y: ob2 show friend nclass operator-(nclass ob return 0 void showo; nclass operator-( nclass obj)∥定义重载单目运算符“” i obj. a-obj a; obj. b=-obj. b; return obj; y void nclass: showo cout≤<“a”<<a<”=”<<b<≤end} 程序运行结果如下: a=10b=20 a=-10b=-20
26 3.单目运算符重载 用友元函数重载单目运算符时,需要一个显式的操作数。 例5.6 用友元函数重载单目运算符“-”例子。 #include<iostream.h> class nclass{ int a,b; public: nclass(int x=0,int y=0) {a=x;b=y;} // nclass的构造函数 friend nclass operator-(nclass obj);//声明重载单目运算符“-” void show(); }; nclass operator-(nclass obj)//定义重载单目运算符“-” { obj.a=-obj.a; obj.b=-obj.b; return obj; } void nclass::show() { cout<<“a””<<a“<”=”<<b<<end } 程序运行结果如下: a=10 b=20 a=-10 b=-20 mian() { nclass ob1(10,20),ob2; ob1.show(); ob2=-ob1; ob2.show(); return 0; }
在例5.4用成员函数重载“++”的成员运算符函数 coord coord:: operator++o +x; ++y; return * this 由于所的成员函数都有一个this指针,this指针指向该函数所属类 对象的指针,因此对私有数据的任何修改都将影响实际调用成员 运算符函数的对象,因而例5.4的执行情况是完全正确的。 如果用友元函数改写上面的运算符函数 coord operator++(coord op) +x;//+op.x; ++y;//++op.y; return op 27
27 使用友元函数重载“+ +” , “- -”这样的运算符,可能会出现的问 题在例5.4用成员函数重载“++”的成员运算符函数: coord coord::operator++() { ++x; ++y; return *this; }; 由于所的成员函数都有一个this指针,this指针指向该函数所属类 对象的指针,因此对私有数据的任何修改都将影响实际调用成员 运算符函数的对象,因而例5.4的执行情况是完全正确的。 如果用友元函数改写上面的运算符函数: coord operator++(coord op) { ++x; // ++op.x; ++y; // ++op.y; return op; };
由于友元函数没有this指针,所以不能引用this指针所指的对象。 这个函数是通过传值的方法传递参数的,函数体内对op的所以修改 都无法传到函数体外。因此,在 operator++函数中,任何内容的改 变不会影响产生调用的操作数,也就是说。实际上对象x和y并未增 加 为了解决以上问题,使用友元函数重载单目运算符“+”或“—”时 ,应采用引用参数传递操作数,这样函数参数的任何改变都影响产 生调用的操作数,从而保持了两个运算符的原意。 28
28 由于友元函数没有this指针,所以不能引用this指针所指的对象。 这个函数是通过传值的方法传递参数的,函数体内对op的所以修改 都无法传到函数体外。因此,在operator++函数中,任何内容的改 变不会影响产生调用的操作数,也就是说。实际上对象x和y并未增 加。 为了解决以上问题,使用友元函数重载单目运算符“++”或“—”时 ,应采用引用参数传递操作数,这样函数参数的任何改变都影响产 生调用的操作数,从而保持了两个运算符的原意
例5.7使用友元运算符函数重写例5.4的程序 iincludesiostream. h> 程序运行的结果如下: class coordi x:10,y:20 int x y x:11,y:21 public x:12,y:22 coord(int i=o, int j=0)x=i;y=j:] void print(0{ cout<< x:"<x“,y:“ <<y<<endl friend coord operator ++(cord&op) ∥声明友元运算符函数,形参为引用 } coord operator' Void mainO) [++opx; I coord ob(10, 20); +top.y; ob. printo return op; ++ob ∥隐式调用友元运算符函数 ob. printo operator++(ob);l式调用友元运算符函数 ob. print(;
29 例5.7 使用友元运算符函数重写例5.4的程序。 #include<iostream.h> class coord{ int x,y; public: coord(int i=0,int j=0) {x=i;y=j;} void print() {cout<<“ x:”<<x<<“ ,y:“<<y<<endl;} friend coord operator ++(corrd&op); //声明友元运算符函数,形参为引用 }; coord operator ++(coord&op) //定义友元运算符函数 { ++op.x; ++op.y; return op; } Void main() { coord ob(10,20); ob.print(); ++ob; //隐式调用友元运算符函数 ob.print(); operator++(ob);//显式调用友元运算符函数 ob.print(); } 程序运行的结果如下: x:10,y:20 x:11,y:21 x:12,y:22
当用友元函数重载单目运算符时,参数表中有一个操作数 一般而言,采用友元函数重载单目运算符@后,可以采用以下 两种方法来使用: aa ∥隐式调用 operator(@(aa);∥显式调用 说明: (1)不能用友元函数重载的运算符是:=,(),[],→其余的 运算符都可以使用友元函数来实现重载。 (2)由于单目运算符“·”可不改变操作数自身的值,所以在例56 重载单目运算符“”的友元运算符函数的原型可写成: friend nclass operator-(nclass obj) 通过传值的方式传递参数
30 当用友元函数重载单目运算符时,参数表中有一个操作数 一般而言,采用友元函数重载单目运算符@后,可以采用以下 两种方法来使用: @aa; //隐式调用 operator@(aa); //显式调用 说明: (1)不能用友元函数重载的运算符是:=,(),[ ],-> 其余的 运算符都可以使用友元函数来实现重载。 (2)由于单目运算符“-”可不改变操作数自身的值,所以在例5.6 重载单目运算符“-” 的友元运算符函数的原型可写成: friend nclass operator –(nclass obj); 通过传值的方式传递参数