zoukankan      html  css  js  c++  java
  • 运算符重载(三)

    我们知道运算符重载函数可以选择两种形式(1)成员函数形式   (2) 全局友元函数形式。那么我们应该怎么样选择呢?

    首先按照语法规定有的运算符只能由成员函数重载的运算符,例如operator[],operator=。而有些运算符既可以用成员函数重载,也可以冲全局友元函数重载,例如:++ ,——,+,—,+=,—=等,像这种既可以用成员函数重载也可以用全局友元函数重载的运算符,我们建议用成员函数重载,因为这样做强调了运算符和类的联合,尤其是二元运算符重载时,当左侧操作数是当前的对象时,运算符会工作的更好。

    但是有时运算符左侧的操作数是别的对象,这种情况通常出现在输入输出流运算符重载时,operator<<,operator>>。此时运算符左侧是流对象,而不是当前的对象(当前对象就是调用运算符函数的对象),那么此时就不能载用成员函数重载运算符了,因为成员函数重载的运算符,都是那种左侧的操作数是当前对象的运算符。

    代码示例:

     1 class IntArray{
     2      enum{size=5};
     3      int m[size];
     4 public:
     5       IntArray(){
     6          memset(i,0,size*sizoef(*i));
     7      
     8        }
     9       int& operator[](int index){
    10   
    11          if(index<0&&index>=size) exit(0);
    12           return i[index];
    13       }
    14 
    15      friend ostream& operator<<(ostream& out,const IntArray& aRef);//左侧的操作数是流对象,因此不能用成员函数重载,只能用友元函数重载
    16      friend istream& operator>>(istream& in,const IntArray& aRef);
    17 };
    18 
    19 ostream& operator<<(ostream& out,const IntArray& aRed){
    20     for(int i=0;i<aRef.size;i++){
    21        out<<aRed.m[i];
    22        if(i!=size-1)
    23         out<<",";
    24      }
    25       out<<endl;
    26       return out;
    27 
    28 }
    29 
    30 
    31 istream& operator>>(istream& in,const IntArray& aRed){
    32 
    33      for(int i=0;i<aRef.size;i++)
    34          in>>aRef.m[i];
    35       return in;
    36 
    37 }
  • 相关阅读:
    linux的文件权限分析
    Bash 文件夹操作
    bash shell 文本文件操作
    Vim文字编辑
    Windows环境Vim编辑器如何执行Ruby代码
    JavaWeb-Servlet
    app遮罩层--网赚
    flex布局 居中
    实现绝对定位元素水平垂直居中的两种方法
    CSS背景图怎么自适应全屏(手机或者电脑)
  • 原文地址:https://www.cnblogs.com/cplinux/p/5651850.html
Copyright © 2011-2022 走看看