3.单目运算符重载 用友元函数重载单目运算符时,需要一个显式的操作数。 例56用友元函数重载单目运算符“”man0 include<iostream. h> class classi i nclass ob1(10,20)2ob2; int a. b: ob1. show public ob2=-ob1 nclass(int X=,int y=0 ta=x; b=y ob2showo friend nclass operator ( nclass ob return 0 void show nclass operator( (nclass obj)∥定义重载单目运算符“” t obj. a=-obj a; obj.b=-obj b; return obj; 3 void nclass. show( cout<“as≤a"=<<b≤end} 程序运行结果如下: a=10b=20 a=-10b=20 26
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 使用友元函数重载“+ +” , “- -”这样的运算符,可能会出现的问 题在例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 由于友元函数没有this指针,所以不能引用this指针所指的对象。 这个函数是通过传值的方法传递参数的,函数体内对op的所以修改 都无法传到函数体外。因此,在operator++函数中,任何内容的改 变不会影响产生调用的操作数,也就是说。实际上对象x和y并未增 加。 为了解决以上问题,使用友元函数重载单目运算符“++”或“—”时 ,应采用引用参数传递操作数,这样函数参数的任何改变都影响产 生调用的操作数,从而保持了两个运算符的原意
例5.7使用友元运算符函数重写例5.4的程序。 include<iostream. h> 程序运行的结果如下: class coord x:10,y:20 int x, y X:11,y:21 public X:12,y:22 coord(int i o, intj=O)Xi;y=j,] void print0{cout<<X:"”≤X<<,y:“<y<≤endl;} friend coord operator ++(cord&op) ∥声明友元运算符函数,形参为引用 coord operator' Void main() [++op x; i coord ob(10, 20) +top.y; ob. print( return op; ++ob, 隐式调用友元运算符函数 ob. printo operator++(ob);显式调用友元运算符函数 ob. printo
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); 通过传值的方式传递参数