http://pppboy.blog.163.com/blog/static/302037962011112311822421/
一、基本认识
2010年学习过的一点总结,今天没防看到,感觉还是不太完善,做事情,就一定要把它做好。不是追求完美,但一定要保持一颗保持进步的心。
二、重载和句法区别
C++规定后缀形式有一个int类型参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数。
一个例子可以说明一切
#include "stdafx.h"
#include <iostream>
class NumUpper
{
public:
NumUpper& operator++()
{
std::cout << "++ prefix\n";
*this += 1; //operator+=
return *this;
}
//后缀 返回const对象,int参数
const NumUpper operator++(int)
{
std::cout << "postfix ++ \n";
NumUpper preNum = *this;
++(*this);
return preNum;
}
NumUpper& operator+=(int num)
{
mNum += num;
return *this;
}
private:
int mNum;
};
int main(int argc, char* argv[])
{
NumUpper upper;
//前置
std::cout << "-----------------------\n";
++upper;
//后置
std::cout << "-----------------------\n";
upper++;
//前置
std::cout << "-----------------------\n";
upper.operator++();
//后置
std::cout << "-----------------------\n";
upper.operator++(0);
std::cout << "-----------------------\n";
system("pause");
return 0;
}
程序输出:
-----------------------
++ prefix
-----------------------
postfix ++
++ prefix
-----------------------
++ prefix
-----------------------
postfix ++
++ prefix
-----------------------
请按任意键继续. . .
从上面的例子可以看到:
前缀形式返回一个引用
后缀形式返回一个const类型对象
三、其它联想
1.const的使用
比如不能用 upper++++这样,因为返回的是const,正好这个const就是为了防止这么连加用的。
2.对自减也是一样
3.还是效率问题
(1)如编程规范所说,不要进行不成熟的劣化:
<1>在使用前置++操作很合适的场合,却偏偏使用了后置++
<2>可以传引用的时候,去偏偏用了传值
<3> 构造函数中可以使用初始化列表,却偏偏使用赋值
(2)大气使用,该用后置的时候还是要用后置,正确远比高效重要
四、引用参考:
《More Effective C++》
《C++标准程序库》