一.什么是操作符的重载?
操作符的重载就是就是把已经定义的、有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能。
二.为什么要进行操作符的重载?
当你自定义了一个类,想要把两个类对象相加,而传统的’+’无法对类对象进行运算,这时候就需要进行运算符的重载了。
三.重载的过程中需要注意什么?
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中该函数是私有属性的,不允许调用)
与<<类似,就不重复叙述了。