C++ 运算符流操作符重载和友元

  1. 操作符重载,计算机学科概念,就是把已经定义的、有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能。操作符重载可以将概括性的抽象操作符具体化,便于外部调用而无需知晓内部具体运算过程。
  2. 调用方式

    1. 5.1调用类中的操作符重载函数的方法:当调用类中定义的操作符重载函数时最左边的对象是调用操作符重载函数的对象。比如在类hyong中重定义的+操作符 hyong operator +(hyong m){},有类hyong的对象m和n则调用操作符重载函数的方法有m+n和m.operator +(n),前一条语句会自动转换为后面这条语句,且m+n的表达式中最左边的对象是调用操作符重载函数的对象,而最右边的那个将被作为参数传送。也就是说n+m会转换成n.operator +(m)。要记住当调用类中定义的操作符重载函数时最左边的对象是调用操作符重载函数的对象。
    2. 5.2 调用友元或独立的操作符重载函数的方法:当调用类的友元操作符重载函数或独立的操作符函数时语句m+n会转换为显示的调用方式,比如有友元或独立操作符重载函数hyong operator +(hyong a,hyong b){}则当出现m+n时会转换成语句operator +(m,n)表达式的第一个对象传给第一个参数,第二个对象传给第二个参数。

    特殊情况

    一般来说操作符重载函数一般不要求作为类的成员函数或者是友元函数,一般情况下可以将操作符重载函数作为类的成员函数。但是有一种情况必须要求操作符函数作为类的友元函数或者是独立的函数,就是一个内置类型和对象相加的情况。比如有语句m+1和1+m第一条可以在类中定义操作符函数的形式为hyong operator +(int i){},语句m+1可以调用这个函数是正确的,但对于1+m就不能调用这个函数了,因为类中的操作符重载函数是最左边的对象是调用该函数的对象,但1+m最左边的是一个内置整型类型1,所以不会调用这条语句,对于这种语句就只能把操作符重载函数定义为独立的函数或类的友元函数即形如hyong operator +(int i,hyong a){}这样1+m就会转换成operator +(1,m)这样就是正确的。当然如果这个操作符重载函数需要访问类中的私有成员时,就应把该函数定义为类的友元函数,如果不需要访问类中的私有成员,则可以定义为友元也可以定义为独立函数。
    必须把它作为类成员函数的运算符有:(),[],->;和任何赋值运算符,重载这些运算符时必须把操作符函数声明为类的成员函数



  3. /************************************************************************************************ 
  4.  * 名  称: friend.cpp 
  5.  * 功  能:学习C++ Premier 的笔记之操作符重载,友元 
  6.  * 描  述:1、友元函数:允许函数访问类的所有成员。 
  7.           2、直接重载操作符,则其中一个操作数必然是本类 
  8.           3、使用友元重载操作符,则可以任意选择操作数,注意 1 处 的区别 
  9.           4、重载>> <<流操作 
  10.           5、单目运算符 最好重载为 成员函数 
  11.           6、只能使用成员函数重载:=,(),[],->,new,delete 
  12.           7、复合赋值运算符,建议重载为成员函数。(+= ,-=,&=,等) 
  13.           8、其他运算符,建议重载为友元。 
  14.  * 作  者:JarvisChu 
  15.  * 时  间:2011-7-23 创建 
  16.  *************************************************************************************************/  
  17. #include <iostream>  
  18.   
  19. using namespace std;  
  20.   
  21. class CRectangle{  
  22. public:  
  23.     //构造函数  
  24.     CRectangle(){}  
  25.     CRectangle(double ht,double wid){height = ht;  width = wid;}  
  26.   
  27.     //计算面积  
  28.     double Area(){  return height*width;}  
  29.     double Width(){return width;}  
  30.     double Height(){return height;}  
  31.   
  32.     //重载输入操作符,友元  
  33.     friend istream& operator >>(istream& in,CRectangle& cls);  
  34.     //重载输出操作符,友元  
  35.     friend ostream& operator <<(ostream& out,CRectangle& cls);  
  36.   
  37.     //重载 +-*/ 运算法,返回面积 和差积除  
  38.     double operator + (const CRectangle rect);   //只实现这一个,下面三个类似  
  39.     double operator - (const CRectangle rect){return 0.0;}  
  40.     double operator * (const CRectangle rect){return 0.0;}  
  41.     double operator / (const CRectangle rect){return 0.0;}  
  42.   
  43.     //重载 [] 运算符,[0] 返回 height, [1] 返回 width  
  44.     double operator [] (const int index);  
  45.   
  46.     //重载 > < = 比较操作符,<span style="color:#ff0000;">注意友元 与 非友元 的区别</span>  
  47.     friend bool operator > (CRectangle rect_1, CRectangle rect_2);// 1处  
  48.     bool operator < (CRectangle rect);  
  49.   
  50.     //析构函数  
  51.     ~CRectangle(){}  
  52. private:  
  53.     double height;  
  54.     double width;  
  55. };  
  56.   
  57. istream& operator >> (istream& in, CRectangle& cls){  
  58.     cout<<"输入矩形的高和宽: ";  
  59.     in>>cls.height>>cls.width;  
  60.     return in;  
  61. }  
  62.   
  63. ostream& operator << (ostream& out, CRectangle& cls){  
  64.     out<<"高:"<<cls.height<<"; 宽:"<<cls.width;  
  65.     return out;  
  66. }  
  67.   
  68. double CRectangle::operator +(CRectangle rect){  
  69.     return Area()+rect.Area();  
  70. }  
  71.   
  72. double CRectangle::operator [](int a){  
  73.     switch(a){  
  74.         case 0:  
  75.             return Height();  
  76.             break;  
  77.         case 1:  
  78.             return Width();  
  79.             break;  
  80.         case 2:  
  81.             return Area();  
  82.             break;  
  83.         default:  
  84.             return 0.0;  
  85.             break;  
  86.     }  
  87. }  
  88.   
  89. bool operator >(CRectangle rect_1, CRectangle rect_2){  
  90.     return (rect_1.Area() > rect_2.Area())  ? true:false;  
  91. }  
  92.   
  93. bool CRectangle::operator < (CRectangle rect){  
  94.     return  (Area() < rect.Area())  ? true:false;  
  95. }  
  96.   
  97. int main()  
  98. {  
  99.     CRectangle rect_1;  
  100.     CRectangle rect_2(10,20);  
  101.   
  102.     //输入输出流 重载  
  103.     cin>>rect_1;  
  104.     cout<<endl<<"rect_1: "<<rect_1<<endl;  
  105.     cout<<"rect_2: "<<rect_2<<endl<<endl;  
  106.   
  107.     //四则运算 重载  
  108.     cout<<"+: "<<rect_1+rect_2<<endl;  
  109.   
  110.     //重载[]  
  111.     cout<<"height[0]: "<<rect_1[0]<<endl<<"width [1]: "<<rect_1[1]<<endl<<" area [2]: "<<rect_1[2]<<endl<<endl;  
  112.   
  113.     //比较运算符 重载  
  114.     if(rect_1 > rect_2) cout<<"rect_1 > rect_2 :  true"<<endl;  
  115.     if(rect_1 < rect_2) cout<<"rect_1 < rect_2 :  true"<<endl;  
  116.   
  117.     return 0;  
  118. }

原文路径:http://blog.csdn.net/jarvischu/article/details/6628559
http://baike.baidu.com/view/1033032.htm?fr=aladdin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值