操作符的重载

来源:互联网 发布:c json 双引号转义 编辑:程序博客网 时间:2024/05/15 23:50

一.什么是操作符的重载?
操作符的重载就是就是把已经定义的、有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能。

二.为什么要进行操作符的重载?
当你自定义了一个类,想要把两个类对象相加,而传统的’+’无法对类对象进行运算,这时候就需要进行运算符的重载了。

三.重载的过程中需要注意什么?
1.并不是所有操作符都可以被重载(例如:: . .* ?:)还有sizeof也不可以被重载
2.操作符重载函数中必须有一个类类型或者自定义类型变量
3.除了’=’外,所有重载操作符都可以被派生类继承
4.不在具备短求职特性
重载操作符不能保证操作符的求职顺序,在重载&&和||中,对每个操作数
都要进行求值,而且对操作数的求职顺序不能做规定,因此:重载&&、||和逗号操作符不是好的做法。
5.一般将算术操作符定义为非成员函数,将赋值运算符定义成员函数
6、操作符定义为非类的成员函数时,一般将其定义为类的友元
7、== 和 != 操作符一般要成对重载
8、下标操作符[]:一个非const成员并返回引用,一个是const成员并返回引用
9、解引用操作符*和->操作符,不显示任何参数
10、自增自减操作符
前置式++/–必须返回被增量或者减量的引用
后缀式操作符必须返回旧值,并且应该是值返回而不是引用返回
11、输入操作符>>和输出操作符<<必须定义为类的友元函数

四.重载操作符[],>>,<<
首先看类的定义

typedef int Datetype;class Array{public:    Array(int i,int j=0)    {        size = i;        b = j;        pdata = new Datetype[size];        if (NULL==pdata)        {            cout << "failure" << endl;            exit(EXIT_FAILURE);        }    }    ~Array()    {        delete []pdata;    }    Datetype&operator[](int i);    friend ostream&operator<<(ostream&_cout, const Array&a);//为何有返回值    friend istream&operator>>(istream&_cin, Array&a);//因为a要改变,不能为constprivate:    Datetype*pdata;//指向数组的指针    size_t size;//数组的大小    size_t b;//该成员在重载>>时用到};

[ ]的重载

Datetype&Array::operator[](int i)//参数为数组的下标,返回值为引用(考虑到返回值作为右值){    static Datetype ch = 0;    if (i > (int)size - 1 || i < 0)//越界访问    {        cout << "out of range\n";        return ch;    }    return pdata[i];}

<<的重载

ostream&operator<<(ostream&_cout, const Array&a){    _cout << a.size;    return _cout;//返回这个cout对象}1.ostream是一个类,cout是它的对象2.cout无法识别自定义类型的变量,所以要重载3.<<可以重载为成员函数,但是输出形式是这样的a<<cout(对象+操作符+参数)(也不是不可以,只是不合乎逻辑),所以重载为友元4.在重载的时候不要加换行,换行不应该在重载中实现。5.为何有返回值(为了满足连续输出cout<<a<<b,输出完a,返回一个ostream类的对象,继续输出b)6.返回值为何为引用(如果返回返回值,返回的临时变量具有常性,它的状态不可修改(cout<<a,要把a的东西放到输出流cout对象中要修改cout的状态))7.第一个参数不可以以值的形式传递会生成cout的临时对象(增加开销),会调用其拷贝构造函数(在vs2013中该函数是私有属性的,不允许调用)

与<<类似,就不重复叙述了。

1 0