1.运算符重载的意义:
通过运算符重载可以改变对类的自定义行为,使得自定义类的行为和内建类型一样。 也可以获得对程序更大的控制权,使用者使用起来更加的方便。
2.运算符重载的限制:
(1) 不能添加新的运算符(只能重载已知的运算符+,-,*,/,new,delete,<<,>>等等)
(2) 有些运算符不能重载(例如::, ., sizeof,?:)
(3) 不能修改运算符的运算数据的个数(例如+就必须使用两个)
(4) 不能修改运算符的优先级和结合性
(5) 不能对内建数据类型进行重载(int类型不能重载)
3.重载的函数
(1) 类方法
(2) 全局函数
4.下面介绍几种常见的运算符重载:
(1) 进行复数的加,减,乘,除(限于整数)
重载的运算符有+,-,*,/,++,--,<<
#include"stdafx.h"
#include<iostream>
usingnamespacestd;
classComplex
{
private:
intx;
inty;
public:
Complex(){};
Complex(int,int);
Complex(constComplex&);
~Complex(){}
Complexoperator+(constComplex&);
Complexoperator-(constComplex&);
Complexoperator*(constComplex&);
Complexoperator/(constComplex&);
intgetX()const{returnx;};
intgetY()const{returny;};
voidsetX(intx){this->x= x;}; //为重载++,--运算符提供方便
voidsetY(inty){this->y= y;};
Complex&operator++(); //前置++
Complexoperator++(int); //后置++
Complex&operator--();
Complexoperator--(int);
friendostream&operator<<(ostream&, Complex&); //输出运算符的重载这个定义为全局的函数
};
Complex::Complex(intxx,intyy):x(xx),y(yy){};
Complex::Complex(constComplex&src)
{
this->x= src.x;
this->y= src.y;
}
ComplexComplex::operator+(constComplex&val)
{
Complextemp;
temp.x= this->x+ val.x;
temp.y= this->y+ val.y;
returntemp;
}
ComplexComplex::operator-(constComplex&val)
{
Complextemp;
temp.x= this->x- val.x;
temp.y= this->y- val.y;
returntemp;
}
ComplexComplex::operator*(constComplex&val)
{
Complextemp;
temp.x= this->x* val.x+ this->y* val.y;
temp.y= this->x* val.y+ this->y* val.x;
returntemp;
}
ComplexComplex::operator/(constComplex&val)
{
Complextemp;
intnum= val.x* val.x- val.y* val.y;
temp.x= (this->x* val.x+ this->y* (-val.y))/ num;
temp.y= (this->x* (-val.y)+ this->y* val.x)/ num;
returntemp;
}
Complex&Complex::operator++()
{
setX(getX()+1);
setY(getY()+1);
return*this;
}
ComplexComplex::operator++(int)
{
Complextemp(*this);
temp.x= getX()+ 1;
temp.y= getY()+ 1;
returntemp;
}
Complex&Complex::operator--()
{
setX(getX()-1);
setY(getY()-1);
return*this;
}
ComplexComplex::operator--(int)
{
Complextemp(*this);
temp.x= getX()- 1;
temp.y= getY()- 1;
returntemp;
}
ostream&operator<<(ostream& os, Complex&val)
{
if(val.getY()== 0)
os<<val.getX()<<endl;
elseif(val.getY()< 0)
os<<val.getX()<<""<<val.getY()<<"i"<<endl;
else
os<<val.getX()<<"+"<<val.getY()<<"i"<<endl;
returnos;
}
int_tmain(intargc,_TCHAR*argv[])
{
Complexc1(1,2);
Complexc2(3,-4);
++c2;
Complexc3= c1+ c2;
cout<< c3;
getchar();
return0;
}
2.现在我们来重载一下下标,new,delete等运算符
#include"stdafx.h"
#include<iostream>
usingnamespacestd;
classArray
{
protected:
int*elem;
size_tcount;
staticconstsize_tcapacitySize= 10; //表示最大容量
public:
Array();
Array(constArray&);
~Array();
intgetElem(size_t)const;
voidsetElem(int,size_t);
voidreSize(size_t);
int&operator[](size_t);
constint&operator[](size_t)const;
void*operatornew(size_t);
voidoperatordelete(void*);
void*operatornew[](size_t);
voidoperatordelete[](void*); //为了简单不使用异常了
};
Array::Array()
{
count= capacitySize;
elem= newint[count];
memset(elem,0,sizeof(elem));
}
Array::Array(constArray&src)
{
count= src.count;
memset(elem,0,sizeof(elem));
for(size_ti=0;i<count;i++)
elem[i]= src.elem[i];
}
Array::~Array()
{
delete[]elem;
elem= NULL;
}
intArray::getElem(size_tpos)const
{
if(pos<0 || pos>count)
{
throwout_of_range("范围错误!");
}
returnelem[pos];
}
voidArray::setElem(intval,size_tpos)
{
if(pos<0 || pos>count)
{
throwout_of_range("范围错误!");
}
elem[pos]= val;
}
voidArray::reSize(size_tnewSize)
{
int*oldElem= elem;
size_toldSize= count;
count= newSize;
elem= newint[count];
memset(elem,0,sizeof(elem));
for(size_ti=0;i<oldSize;i++)
elem[i]= oldElem[i]; //将数据赋值过去在进行删除
delete[]oldElem;
}
int&Array::operator[](size_tpos)
{
if(pos<0 || pos>count)
{
throwout_of_range("范围错误!");
}
returnelem[pos];
}
constint&Array::operator[](size_tpos)const //const数据使用这个非const使用上面的
{
if(pos<0 || pos>count)
{
throwout_of_range("范围错误!");
}
returnelem[pos];
}
void*Array::operatornew(size_tsize)
{
return::operatornew(size); //使用全局的new
}
voidArray::operatordelete(void*ptr)
{
::operatordelete(ptr);
}
void*Array::operatornew[](size_tsize)
{
return::operatornew[](size);
}
voidArray::operatordelete[](void*ptr)
{
::operatordelete[](ptr);
}
int_tmain(intargc,_TCHAR*argv[])
{
Arrayarr;
arr.setElem(1,0);
cout<<arr.getElem(0)<<endl;
cout<<arr[0]<<endl;
getchar();
return0;
}