• 运算符重载(三)


    我们知道运算符重载函数可以选择两种形式(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 }
  • 相关阅读:
    使用dozermapper,处理不了LocalDateTime的映射问题:java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>()
    mybatis-plus使用Wrapper自定义sql时出现错误:Invalid bound statement (not found)
    com.baomidou.mybatisplus.core.mapper 不存在
    python爬虫
    DRF源码系列分析
    python学习目录
    脚本加载django环境
    celery定时任务
    用脚本创建django-orm数据库表数据
    关于python很吊的一项技术!!!!!
  • 原文地址:https://www.cnblogs.com/cplinux/p/5651850.html
Copyright © 2020-2023  润新知