C++运算符重载

十年热恋 提交于 2019-11-27 15:48:22

一、操作符函数重载

什么是操作符函数:在C++中针对类类型的对象的运算符,由于它们肯定不支持真正的运算操作,因此编译器会将它们翻译成函数,这种就叫作操作符函数(运算符函数)。
编译器把运算符翻译成运算符函数,可以针对自定义的类类型设计它独有的运算功能。
其实各种运算符已经具备某些功能,再次实现它的就是叫做运算符重载

双目运算符:
	a+b
	成员函数
		a.operator+(b);
	全局函数
		operator+(a,b);
单目运算符:
	!a
	成员函数
		a.operator!(void);
	全局函数	
		operator!(a);

二、双目运算符函数重载

成员函数:
const 类 operator#(const 类& that) const
{
	return 类(参数#参数);
}
注意:双目运算符的运算结果是个右值,返回值应该加 const,然后为了 const 对象能够调用,参数应该写 const ,函数也应该具备 const 属性。
		
全局函数:
const 类 operator#(const 类& a,const 类& b)
{

}
注意:全局函数不是成员函数,可能会访问到类的私有成员,解决这种问题可以把函数声明为类的友元函数(友元不是成员)

友元:在类的外部想访问类的私有成员时,需要把所在的函数声明为友元,但友元只是朋友,没有实际的拥有权,因此它只有访问权,没有实际的拥有权(其根本原因是它没有 this 指针)。

友元声明:把函数的声明写在一份类中,然后在声明前加上 friend 关键字,使用友元既可以把操作符函数定义为全局的,也可以确保类的封装性。

注意:友元函数与成员函数不会构成重载关系,因为它们不在同一个作用域内。

三、赋值类型的双目操作符

1、区分单参构造与赋值运算符的调用情况
String str = "sunll";//会调用单参构造,而不会调用赋值运算符		

2、左操作数据不能具有 const 属性
	1、成员函数不能是常函数
	2、全局函数第一个参数不能有 const 属性		

四、单目操作符函数重载

成员
	const 类 operator#(void)
	{
	
	}
全局
	const 类 operator#(const 类& that)
	{
	
	}	

五、输入和输出操作符重载

cout 是 ostream 类型的对象,cin 是 istream 类型的对象
如果<</>>运算符实现为成员函数,那么调用者应该是 ostream/istream,而我们无权增加标准库的代码,因此输入/输出运算符只能定义为全局函数
	
ostream& operator<<(ostream& os,const 类& n)
{

}
istream& operator>>(istream& is,类& n)
{

}	
注意:在输入输出过程中,cin/cout 会记录错误标志,因此不能加 const 属性		

关于操作重载的建议:

1、在重载操作符时要根据操作符实际的功能和意义来缺点具体参数,返回值,是否具有 const 属性,返回值是否是引用或者是临时对象
2、重载操作符要符合情理(要有意义),要以实际用途为前提。
3、重载操作符的意义是为了让对象的操作更简单、方便、而不是为了炫技。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!