c++运算符重载(上)

参考书籍:面向对象程序设计(c++)

  • 运算符重载的规则
  • 运算符重载为友元函数
  • 运算符重载为成员函数
  • 几种常用的运算符重载

当编译器无法完成一些我们想要实现的功能的时候,例如(坐标之间的相加),这时候我们就需要自己去定义运算符。

运算符重载的规则

运算符重载的格式

重载运算符函数的一般格式为:
T operator +(int a,int b)
{
return a+b;
}

T为返回类型,operator为关键字,@为运算符名称,参数表为参数运算的数据即操作数,可以是一个或者两个,分别对应单目运算符和双目运算符
运算符函数的参数建议都声明为引用型,可以最大程度地提高运行效率,如果不希望在函数内部对参数有所改动,可以在参数前加const关键字加以限定

运算符重载需要遵守的规则

c++中有5个运算符不能重载:

  • 成员访问运算符 : .
  • 成员指针运算符:.*
  • 域操作运算符:::
  • 条件运算符:?:
  • 空间计算运算符:sizeof

运算符重载应该符合实际需要,重载的功能应该域运算符原有的功能类似

运算符重载为友元函数

声明的一般形式为:
friend 返回类型 operator @(参数表);

而函数的具体定义如下:
返回类型 operator @(参数表)
{
//函数体
}

返回类型通常与它所操作的类的类型相同,参数的类型通常也与它所操作的类的类型相同,声明成友元函数的原因主要是可以提高执行效率
下面是Complex类的友元函数运算符重载

class Complex{
private:
	double image;
	double real;
public:
	Complex(double x = 0.0,double y = 0.0)
	{
		real = x;
		image = y;
	}
	void Print()
	{
		cout << real << "+" << image << "i" << endl;
	}
	friend Complex operator +(const Complex& c1, const Complex& c2);
};

Complex operator +(const Complex& c1, const Complex& c2)
{
	Complex temp(c1.real + c2.real, c1.image + c2.image);

	return temp;
}

由上面的坐标相加的例子我们可以知道几个细节:
1.由于友元函数的返回类型是Complex,所以临时变量temp也必须是Complex型(如果你要想简单点,直接return Complex(c1.real + c2.real, c1.image + c2.image);也行)
2.此例中无需修改c1和c2的值,所以这里用到了const修饰

运算符重载为成员函数

由于友元函数与类配合的情况降低了该类的独立性,破坏了该类的封装特性。因此在一般情况下,应将类所涉及的所有操作都定义在类中,即应将类的运算符重载成类中的成元函数。注意:如果是重载双目运算符,就只要设置一个参数作为右侧运算量,而左侧运算符就是该对象本身;如果是重载单目运算符,就不必另外设置参数,运算符的操作量就是对象本身
下面仍以Complex类为例,包括成元函数的方式重载减法”-“和相等比较符”==“,以及求负反符号”-“

class Complex{
private:
	double image;
	double real;
public:
	Complex(double x = 0.0,double y = 0.0)
	{
		real = x;
		image = y;
	}
	void Print()
	{
		cout << real << "+" << image << "i" << endl;
	}
	Complex operator -(const Complex& c);
	Complex operator -();
	bool operator ==(const Complex& c);
	Complex &operator +=(const Complex& c);
};

Complex Complex ::operator -(const Complex& c)
{
	Complex temp(real - c.real, real - c.image);
	return temp;
}

bool Complex ::operator ==(const Complex& c)			//此函数为判断,所以是bool类型的
{
	return (real == c.real && image == c.image);
}

Complex Complex::operator-()
{
	return (-real, -image);
}
	
Complex& Complex::operator +=(const Complex& c)				//对自身的值需要修改,所以要加上&
{
	real += c.real;
	image += c.image;
	return *this;						//返回对象本身的引用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值