• 运算符重载(三)


    我们知道运算符重载函数可以选择两种形式(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 }
  • 相关阅读:
    索引,约束
    C# Dictionary 的几种遍历方法
    唯一性约束和唯一性索引的区别
    JS中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
    Dictionary学习笔记嵌套Dictionary的遍历与排序(按Key值)(二)
    Dictionary学习笔记Dictionary定义与输出(一)
    集体智慧编程笔记搜索和排序
    emacs键盘映射
    集体智慧编程笔记推荐系统
    使用SRILM训练大的语言模型
  • 原文地址:https://www.cnblogs.com/cplinux/p/5651850.html
Copyright © 2020-2023  润新知