zoukankan      html  css  js  c++  java
  • C++运算符重载总结

    有些同学对运算符重载几个小地方不明确,现在按照我对重载的研究总结一下~~~

    1.对于单目运算符,建议选择成员函数;
    2.对于运算符“=,(),[],->”只能作为成员函数;
    3.对于运算符“+ =,-=,/=,*=,&=,!=,~=,%=,<<=,>>=”(双目运算符)建议重载为成员函数;
    4.对于其他运算符,建议重载为友元函数。
    5.成员符号(.), 范围标志(::),条件判断(?:)不能被重载
    6.除赋值号以外的所有操作符函数都可以被继承。
    7.在操作符函数里不能使用缺省的参数值。
    8.不能把任何操作符的实现定义为静态成员函数。

    9.<< >>运算符只能重载为友元函数。

    一,关于class中将operator函数定义为friend主要有以下考虑: 
    1.friend 函数是对外公开的,而class method是属于对象的,有些情况调用不方便 
    2.对某些需要两个参数的operator function,定义friend比较方便,如下面的operator << 
    3.所有class method必须有匹配的左值类型进行调用而friend则无需这样,只要能隐式转化成当前类型就可以调用该函数,因此构造函数没有定义为explicit的,可以进行隐式转化,就可以在不同类型间运算。
    4.在iostream中,>>和<<本身就被定义为一个类的对象,和传统的+,-,++等都是不同的,所以在进行这两个操作符重载的时候就非常的特殊的,因为它们本身是一个类的对象,在重载了以后就必须是用友元函数来调用访问,一个类里面是可以定义另一个类的成员的,但不可能在一个类里面用操作符来实例化一个成员。所以想要对这两个操作符重载的时候也就只能用友元函数了。
    注意:不光重载的输入输出流,所有class method必须有匹配的左值类型进行调用而friend则无需这样。 
    5.流插入运算符(<<)、流提取运算符(>>)重载
    声明之一般格式: 

    ostream & operator << (ostream &,自定义类 &); //流插入重载声明

    istream & operator >> (istream &,自定义类 &); //流提取重载声明

    定义之一般格式:

    ostream & operator << (ostream & 对象名,自定义类 & 对象名)

    {对<<的重载处理} //流插入重载函数定义

    istream & operator >> (istream & 对象名,自定义类 & 对象名)

    {对>>的重载处理} //流提取重载函数定义
    (二)关于赋值运算符
    1.在我的理解c/c++赋值运算符的本意就是“返回左值的引用”(左值:赋值号左面的变量而非其值)
    2.为了进行连续赋值,即 x = y = z
    注意(对于a = b(a,b均为对象时),若不返回左值的引用,将会生成临时对象。如果不处理a = b = c这样的表达式,也会正常(只是会调用拷贝构造函数和析构函数处理临时对象,但有时会出现一些问题)
    关于赋值运算符是否返回引用
    1、赋值返回引用
    x = y = z 先执行y = z,返回y的引用,执行x = y
    2、赋值不返回引用
    x = y = z 先执行y = z,返回用y初始化的临时对象(注意临时对象都是常对象),再执行x = y的临时对象(要求operator=(const X&) ),返回用x初始化的临时对象(此处要求拷贝构造函数必须为X(const X&) ))
    【如果在类中没有说明本身的拷贝构造函数和赋值运算符,编译程序将会提供,但他们都只是对对象进行成员浅拷贝。在那些指向堆空间指针作为数据成员的类中,必须避免使用浅拷贝,而要为类定义自己的赋值运算符,以给对象分配堆内存。】
    3.int friend operator = (int a, integer b);这样重载之后,语句2 = a; 表述也是正确的,但是却是明显的语法错误,缺少左值!为了避免此类错误,需要将赋值操作符重载为成员函数
    总结:也就是说重载操作符为成员函数的时候左操作数必须是类的类型,而友员函数可以任意调换顺序。
    (三)关于双目运算符
    重载双目运算符可以用友元或者成员函数,但是两者有区别
    例:如用成员函数重载了 + 之后(还用上面(二)的例子,但此时赋值运算符 = 已经被重载为成员函数)
    a = a + 1;是被支持的,而a = 1 + a;就是不被允许的
    这种情况下就要使用友元函数来对运算符重载以避免不必要的麻烦
    总结:也就是说重载操作符为成员函数的时候左操作数必须是类的类型,而友员函数可以任意调换顺序。用专业术语说就是如果选择类成员函数,则限定了运算符左边的数据类型只能是当前类数据类型,当选择友元时可以拓展数据类型的范围。
    (四)关于++,--的重载
    1,作为前缀时,操作符首先改变操作数的值,然后再把结果返回,函数实际返回的是一个当前对象的引用;
    2,作为后缀时,函数返回的是对象原始值的拷贝。其参数的缺省类型是int型,如果没有对它赋值,则它的值设为0。这样做的唯一目的是为了区别不同的函数定义。
    (五)关于[]的重载
    当类内有数组类数据类型时,用operator[int index]可以返回数组元素。函数应该返回引用,从而使下标可以出现再赋值号的任意一侧。
    (六)关于()的重载
    这个操作符的用途是使类的对象可以象函数名称一样使用。用户可以用多个定义对此操作符进行重载。
    (七)其余的重载运算符在教材上有很明确的语句规则,有什么不明白随时@我~~~

  • 相关阅读:
    转战博客园
    C++虐恋:MBCS安装失败导致的四天误工
    Servlet 3.0 新特性详解 (转载)
    数据库连接池proxool的两种使用方式
    java异常处理中的细节
    InvocationTargetException异常的深入研究-servlet的setAttribute与getAttribute
    如果我是一个全栈极客,那么,下一步该怎么走?
    C++基础与提高 001
    用户及文件权限管理
    命令行操作体验
  • 原文地址:https://www.cnblogs.com/yeanzhi/p/3121520.html
Copyright © 2011-2022 走看看