运算符重载

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运算符重载相关的知识,希望对你有一定的参考价值。

关键字:operator

相见:《高质量程序设计指南》 P255

如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符。

如果运算符被重载为类的成员函数,那么一元运算符没有参数(但是++和--运算符的后置版本除外),二元运算符只有右侧参数,因为对象自己成了左侧参数。

技术分享

技术分享

 

运算符重载的特殊性

  1. 如果重载为成员函数,则this对象发起对它的调用
  2. 如果重载为全局函数,则第一个参数发起对它的调用
  3. 禁止用户发明该语言运算符集合中不存在的运算符
  4. 除了函数调用运算符“()”外,其他运算符重载函数不能有默认参数值
  5. 不要试图改变重载运算符的语义,要与其内置语义保持一致。如果你把“++”运算符重载后让它执行递减操作,重载“<<=”和“>>=”执行I/O操作,都会损害程序的可理解性。
  6. 某些运算符之间可以互相推导..............................................


不能重载的运算符

 

  1. 不能重载".",因为它在ADT/UDT中对任何成员都有意义,已成为标准用法
  2. 不能重载反引用类成员指针“.*”
  3. 不能重载作用域解析运算符"::"
  4. 不能重载那个唯一的三元运算符---条件运算符“?:”
  5. 不能重载sizeof()和typeid()
  6. 不能重载C++的新式类型转换运算符:static_cast<>,dynamic_cast<>、const_cast<>、reinterpret_cast<>。
  7. 不能重载“#”和“##”等预处理操作符

 

重载 ++ 和 --

C++标准规定:当为一个类型重载“++”和“--”的前置版本时,不需要参数;当为一个类型重载“++”和“--”的后置版本时,需要一个int类型的参数作为标志(即哑元,非具名参数)

class Integer
{
public:
	Integer(long data) :m_data(data) {}
	Integer& operator++()//前置版本:返回引用
	{
		cout << "Integer& operator++() called!" << endl;
		m_data++;
		return *this;
	}

	Integer operator++(int)//后置版本:返回对象的值
	{
		cout << "Integer& operator++(int) called!" << endl;
		Integer temp = *this;
		m_data++;	//或++(*this);
		return temp;  //返回this对象的旧值
	}
protected:
private:
	long m_data;	//对long 的封装
};

int main()
{
	Integer x = 1;//call Integer(long)
	++x;	//call operator++()
	x++;	//call operator++(int)
	return 0;
}

 

当"++" 和 "--"应用于基本类型数据时,前置版本和后置版本在效率上没有多大差别。然而,当应用于用户定义类型,尤其是大对象的时候,前置版本就会比后置版本的效率高许多。后置版本总是要创建一个临时对象,在退出函数还要销毁它,而且返回临时对象的值时还会调用其拷贝对象。所以,如果你可以选择的话,尽量使用前置版本。  

以上是关于运算符重载的主要内容,如果未能解决你的问题,请参考以下文章

[C++潜心修炼] operator重载

了解下C# 运算符重载

运算符重载与const对象

C++之重载运算与类型转换

运算符重载

operator