运算符重载c++

1、运算符重载的概念
在c++中预定义的运算符只能操作基本的数据类型,在实际应用中,有些自定义的数据类型,如类和结构体,也需要类似的操作。
比如:

class Complex    //复数类
{
private:
double image;
double real;
public:
Complex(double x=0.0,double y=0.0):real(x),image(y){}
Complex Add(const Complex &c){Complex temp(real+c.real,image+c.image);return temp;}
};
int main(){Complex a(5,7),b(10,9),c;c=a.Add(b);}

在这里的Add是复数之间的加法,而我们习惯上写为c=a+b;
有两个整形(int)变量 i,j
在编译器分析:i+j 时会解释:
operator +(i,j)
其中operator为关键字。当然编译器有许多这些的重载类型:
operator +(int,int)
operator +(float,float)
operator +(double,double)
所以系统会用operator +(int,int)与表达式operator +(i,j)进行匹配。这里既然系统预定义的运算符可以实现重载,那用户也可以向重载普通函数一样重载运算符函数。
2、运算符重载的规则
一般格式为:
T operator @(参数表)
{
重载函数体
}
T为返回类型,@为运算符名称,参数表的个数取决于需要的操作数量。
一般在对类的对象进行操作的函数中,都要能访问类的私有成员。所以一般定义运算符函数为成员函数(称为:成员运算符函数)或者友元函数(称为:友元运算符函数)
c++允许重载的运算符
算数运算符:+ - * / %
关系运算符:==,!=,<,>,<=,>=
逻辑运算符:&&,||,!
赋值运算符:=,+=,-=,=,/=,%=,&=,^=,|=,<<=,>>=
位运算符:|,&,~,^,<<,>>
单目运算符:+,-,
,/
自增,自减运算符:++,–
动态内存操作运算符:new,delete,delete[]
其他运算符:(),[]
不允许重载
成员运算符:.
成员指针运算符:. *
域操作运算符:::
条件运算符:?:
空间计算运算符:sizeof
此外c++不允许定义新的运算符,只能对c++语言中预定义运算符进行重载
3、运算符重载为友元函数
声明的一般形式:
friend T operator @(参数表);
一般定义:
T operator @(参数表)
{
//函数体
}
在类外定义时不需要加上域名。其中T为返回类型@为运算符名称
双目运算符:
friend T operator@(T a,T b);T为类型名(也是返回类型)@表示运算符,a为左操作数,b为右操作数。一般为了提高传参效率,参数通常都是引用类型。friend T operator@(T &a,T &b);
单目运算符:
friend T operator@(T a);T表示类名,@表示运算符,a为操作数。
选择采用友元的方式的目的是希望尽量保持类的封装性。另外重载双目运算符时函数中的形参必须是两个,不能省略,重载的运算符不满足交换律。
例如:
希望将复数和一个整数相加,整数加到实数部分

//声明为
friend Complex operator +(Complex &c,int i);
//定义为
Complex operator +(Complex &c,int i){return(c.real+i,c.image);}
//则有:
c3=c1+5;//正确
c3=5+c1;//错误,没有合适的匹配类型,需要在一次对函数进行相应的重载

4、运算符重载为成员函数
运算符重载为友元函数,相比于重载为友元函数;提高了类的独立性,保护了类的封装性。
因此在一般情况下,应将类所涉及的所有操作都定义在类中,即应将类的运算符重载成类中的成员函数。因为是在类中定义的操作,操作的一方就是当前的对象,成员变量也可以自由访问。基于此,如果是双目运算符只需设置一个右侧运算量而左侧则为该对象本身;如果是单目运算符,就不必另外设置参数,运算符的操作量就是对象本身。
举例:以Complex类,以成员函数重载减法“-”和相等比较运算“==”,以及求负取反符号“-”,说明运算符重载。

class Complex    //复数类
{
private:
	double image;
	double real;
public:
	Complex(double x = 0.0, double y = 0.0) :real(x), image(y) {}//构造函数
	Complex operator -() { return Complex(-real, -image); }//求负取反
	Complex operator -(const Complex& c) {return Complex(real - c.real, image - c.image);}//减法操作,双目运算符
	bool operator ==(const Complex& c) { return (real==c.real &&image==c.image ); }//判断是否相等
	Complex& operator += (const Complex& c);
	void show();//显示为复数类
};

Complex& Complex::operator+=(const Complex& c)
{
	real += c.real;
	image += c.image;
	return *this;
}

void Complex::show()
{
	cout << real << "+" << image << "!" << endl;
}

针对双目运算符被重载为成员函数,实质是运算符左侧的对象调用的自身的运算符函数函数,右侧的操作量作为运算符函数的参数,因此要求运算符左侧的操作量必须是类的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值