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]可以返回数组元素。函数应该返回引用,从而使下标可以出现再赋值号的任意一侧。
    (六)关于()的重载
    这个操作符的用途是使类的对象可以象函数名称一样使用。用户可以用多个定义对此操作符进行重载。
    (七)其余的重载运算符在教材上有很明确的语句规则,有什么不明白随时@我~~~

  • 相关阅读:
    topcoder srm 320 div1
    topcoder srm 325 div1
    topcoder srm 330 div1
    topcoder srm 335 div1
    topcoder srm 340 div1
    topcoder srm 300 div1
    topcoder srm 305 div1
    topcoder srm 310 div1
    topcoder srm 315 div1
    如何统计iOS产品不同渠道的下载量?
  • 原文地址:https://www.cnblogs.com/yeanzhi/p/3121520.html
Copyright © 2011-2022 走看看