重载++操作符的一些感悟

好久没总结东西了。在过一个多星期就可以结束实习了。刚好这段时间有空开始整理以前的学习笔记。哈哈,就当复习吧。

这一篇写的是关于C++重载操作符,代码比较简单,以++为例,其他也是相通的。

#include <iostream>
using namespace std;
class DefType{
	//ostream是一个类,平常用的cout就是它的实例。这里我们重载一下<<运算符
	//括号里面的两个参数os跟t,分别是<<左右两边的操作数
	//如果os不是引用类型会出现什么情况呢?为什么?
	friend ostream& operator<<(ostream& os, const DefType& t)
	{
		return os<<t.m_iVale<<endl;
	}
	int m_iVale;
public:
	//显式定义构造函数
	explicit DefType(int i = 0):m_iVale(i){}
	//prefix++,前缀、前置
	//注意返回的类型是引用
	DefType& operator++()
	{
		++(this->m_iVale);
		return *this;
	}
	//postfix++,后缀、后置
	//注意返回的类型是带const,而且参数类型必须是int,否则会出现下面错误:
	//error C2807: the second formal parameter to postfix 'operator ++' must be 'int'
	const DefType operator++(int)
	{
		DefType tmp = (*this);
		//代码复用,调用前置操作符
		++(*this);
		return tmp;
	}
};
int main()
{
	DefType dt(100);
	cout<<dt++;//自动调用后置操作符,输出的是100
	cout<<++dt;//自动调用前置操作符,输出的是102
	cout<<dt.operator++();//手动调用前置操作符,输出的是103
	cout<<dt.operator++(0);//手动调用后置操作符,输出的是103
	return 0;
}

小结:1)前置跟后置的返回类型不一样的;

           2)后置会带一个参数类型int,但并不会被用到,如果不加编译器会提示C2807错误;

           3)前置要比后置效率高:后置会引入一个临时对象,同时调用前置的重载实现。

原文地址:https://www.cnblogs.com/suncoolcat/p/3301712.html