运算符重载
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运算符重载相关的知识,希望对你有一定的参考价值。
关键字:operator
相见:《高质量程序设计指南》 P255
如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符。
如果运算符被重载为类的成员函数,那么一元运算符没有参数(但是++和--运算符的后置版本除外),二元运算符只有右侧参数,因为对象自己成了左侧参数。
运算符重载的特殊性
- 如果重载为成员函数,则this对象发起对它的调用
- 如果重载为全局函数,则第一个参数发起对它的调用
- 禁止用户发明该语言运算符集合中不存在的运算符
- 除了函数调用运算符“()”外,其他运算符重载函数不能有默认参数值
- 不要试图改变重载运算符的语义,要与其内置语义保持一致。如果你把“++”运算符重载后让它执行递减操作,重载“<<=”和“>>=”执行I/O操作,都会损害程序的可理解性。
- 某些运算符之间可以互相推导..............................................
不能重载的运算符
- 不能重载".",因为它在ADT/UDT中对任何成员都有意义,已成为标准用法
- 不能重载反引用类成员指针“.*”
- 不能重载作用域解析运算符"::"
- 不能重载那个唯一的三元运算符---条件运算符“?:”
- 不能重载sizeof()和typeid()
- 不能重载C++的新式类型转换运算符:static_cast<>,dynamic_cast<>、const_cast<>、reinterpret_cast<>。
- 不能重载“#”和“##”等预处理操作符
重载 ++ 和 --
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; }
当"++" 和 "--"应用于基本类型数据时,前置版本和后置版本在效率上没有多大差别。然而,当应用于用户定义类型,尤其是大对象的时候,前置版本就会比后置版本的效率高许多。后置版本总是要创建一个临时对象,在退出函数还要销毁它,而且返回临时对象的值时还会调用其拷贝对象。所以,如果你可以选择的话,尽量使用前置版本。
以上是关于运算符重载的主要内容,如果未能解决你的问题,请参考以下文章