C++运算符重载

来源:互联网 发布:软件项目 决算书 编辑:程序博客网 时间:2024/05/18 00:12

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;

}



0 0
原创粉丝点击