好久没总结东西了。在过一个多星期就可以结束实习了。刚好这段时间有空开始整理以前的学习笔记。哈哈,就当复习吧。
这一篇写的是关于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)前置要比后置效率高:后置会引入一个临时对象,同时调用前置的重载实现。