运算符重载

双目运算符重载为成员函数:

重载为类成员的运算符函数定义形式:

函数类型 operator 运算符(形参)

{

 ........

}

参数个数 = 原操作数个数 - 1 (后置++, --除外)


双目运算符重载规则

如果要重载B为类成员函数,使之能够实现表达式 oprd1 B oprd2, 其中oprd1 为A类对象,则B应被重载为A类的成员函数,形参类型应该是oprd2所属的类型

经过重载后,表达式oprd1 B oprd2相当于 oprd1.operator B(oprd2)

例子:

Complex Complex::operator + (const Compex &c2) const{
	return Complex(real + c2.real, imag+c2.imag);//利用带参构造函数
}
//这里是一个重载加法的函数。其中利用了Complex类的带参构造函数,使之实现

单目运算符重载规则

如果要重载U为类成员函数,使之能够实现表达式U oprd, 其中oprd为A类对象,则U应该被重载为A类成员函数,无形参,表达式 U oprd 相当于 oprd.operator U()

后置单目运算符 ++ 和 -- 重载规则

如果要重载++ 或-- 为类成员函数。使之能够实现表达式oprd ++ 或oprd--, 其中oprd为A类对象,则++或==应该被重载为A类的成员函数,且具有一个int类型形参。

经过重载之后,表达式 oprd ++ 相当于 oprd.operator ++(0)

也就是说 后置单目运算符重载比前置单目运算符重载多了一个int类型的形参


运算符重载为非成员函数(类外)

函数的形参代表以此自左至右次序排列的各操作数

重载为非成员函数时: 参数个数= 愿操作个数(后置++, -- 除外)

                                至少应该有一个自定义类型的参数

后置单目运算符++ 和-- 的重载函数,形参列表中要增加一个int,但是不用写形参名

如果在运算符的重载函数中需要操作某类对象的私有成员,可以将此函数声明为该类的友元


运算符重载为非成员函数的规则:

-双目运算符B重载后:表达式oprd1 B oprd2,等同于operator B(oprd1, oprd2)

-前置单目运算符B重载后,表达式 B oprd, 等同于 operator B(oprd)

-后置单目运算符 ++ 和 -- 重载后,表达式 oprd B, 等同于 operator B(oprd, 0)

例子:重载Complex的加减法和“<<”运算符为非成员函数

#include <iostream>
using namespace std;

class Complex{
public:
	Complex(double r = 0.0, double i = 0.0):real(r), imag(i){}
	friend Complex operator + (const Complex &c1, const Complex &c2); // 传常引用,既提高了效率又能防止数据丢失
																	  // 因为不是类内函数,所以声明为函数的友元
	friend Complex operator - (const Complex &c1, const Complex &c2);
	friend ostream &operstor <<(ostream &out, const Complex &c);
private:
	double real;
	double imag;

}



Complex operator + (const Compex &c1, const Complex &c2) {
	return Complex(c1.real + c2.real, c2.imag+c2.imag);
}


Complex operator + (const Compex &c1, const Complex &c2) {
	return Complex(c1.real - c2.real, c2.imag - c2.imag);
}

ostream & operator <<(ostream &out, const Complex &c){  // 左操作数是std::ostream引用,右操作数为复数类的常引用
														// 返回std::ostream引用,用以支持下面形式的输出:
														// cout<< a << b; 该输出调用的是: operator << (operator << (cout,a),b)
	out << "(" << c.real <<"," <<c.imag <<")";
	return out;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值