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