操作符的重载

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

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

三.重载的过程中需要注意什么?
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要改变,不能为const

private:
    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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值