1、尽量用const enum inline替换#define
因为#define是做预处理操作,编译器从未看见该常量,编译器刚开始编译,它就被预处理器移走了,而#define的本质就是做替换,它可能从来未进入记号表
解决方法是用常量替换宏
语言常量会被编译器看到,会进入记号表内
#define不注重域的范围,而const可以,#define不能定义类常量,也不能提供封装性,比如private等
用#define定义“函数”问题会非常大
int a = 5, b = 0;
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
如果调用CALL_WITH_MAX(++a, b); //a会累计加两次,(++a) > (b) ? (++a) : (b);
因为++a > b,所以使用++a的值(三目运算符)
如果调用CALL_WITH_MAX(++a, b + 10);就会累计加一次,因为a < b了,所以取值b,之加了一次
在迭代器中,若迭代器不做值修改那么可以用const_iterator,以此提高性能
例如:
const std::vector<int>::iterator iter = vec.begin();//iter的作用类似于T* const
*iter = 10;//正确
++iter;//错误
std::vector<int>::const_iterator citer = vec.begin();//iter的作用类似于const T*
*citer = 10;//错误
++citer;//正确
const加在返回值身上:
const Rational operator* (const Rational& lhs, const Rational& rhs);
如果不加,那么我可以写成:Rational a, b, c;
(a * b) = c;//而a*b返回的是一个右值