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;
}
- C++-运算符重载
- [C++]重载运算符
- C#:运算符重载
- c++-++运算符重载
- C++:重载运算符
- 运算符重载(C++)
- [c++]运算符重载
- 【C++】运算符重载
- C++--------------------------------------------运算符重载
- C#:运算符重载
- C++:运算符重载
- C++:运算符重载
- C#:运算符重载
- [C++]运算符重载
- 【c++】运算符重载
- C++:运算符重载
- C#:运算符重载
- C++:运算符重载
- 方向最重要
- 表达式与表达式树
- 三行代码实现十进制转二进制
- i Media Center Player更新
- Poj 3648 Wedding (2-sat 输出方案)
- C++运算符重载
- 选择排序
- 如何在iphone/ipad上安装低版本App
- python文件和目录访问File and Directory Access
- java.util.Collections.swap()方法实例
- hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现
- Apache Spark的发光点
- (七)取词翻译实现
- C++引用