EffectiveC++
宁可以编译器替换预处理器
define 不被视为语言的一部分,因此也就有可能在预处理阶段被优化掉,导致相关变量出现错误。
#define ASPECT_RATIO 1.63
//可以尝试将其替换为
const double AspectRatio=1.63
这里注意一下大写名称常用于宏,因此,转写时候将相关名称进行了相应的替换
1.定义常量的指针constant pointers 由于定义式通常被放在头文件内,因此有必要将指针声明为const
若要在头文件内定义 一个常量
char * based字符串
必须要写两次
const char *const authorName="ScottMeyers"
或者在C++中将其写成如下格式
const std::string authorName("ScottMeyers");
2.class 专属常量,为了将常量的作用域(scope)限制于class内,你必须让他成为class的一个成员member;而为了确保此常量至多只有一份实体,它就必须有必要成为static成员
class Sem
{
private:
static const int isnum=5;//这里是常量式的声明
int scores[isnum];
public:
void std_print()
{
std::cout<<isnum;
std::cout<<" ";
for(auto s:scores)
{
std::cout<<s<<" ";
}
std::cout<<std::endl;
}
};
private:
static const int isnum=5;//这里是常量式的声明
int scores[isnum];
private:
static const int isnum;//将声明放在头文件里面
const double Sem::isnum=5;//将实现放在文件中
private:
enum {isnum=5};//the enum hack补偿做法,即一个属于枚举类型的数可权充int 被使用
int scores[isnum];
关于宏与内联函数:尽量以内联的模板函数代替宏(类似于实现函数功能的宏)
#include <iostream>
#define CALL_WITH_MAX(a, b) ((a) > (b) ? (a) : (b))
int main()
{
int a = 5, b = 0;
CALL_WITH_MAX(++a, b);//这里的++会执行2次
std::cout << a << " " << b << std::endl;
CALL_WITH_MAX(++a, b + 10);//这里的++就执行一次
std::cout << a << " " << b << std::endl;
}
原因:第一次执行的宏从简单替换开始返回到a后再执行一次++
而第二次执行的宏因为没有返回到a,这次返回到的是b所以不会有第二次++
相反的若要替换成功能相同的内联函数就不会出现这样的问题
template <typename T>
inline T CallWithMax(const T&a,const T&b)
{
return (a>b?a:b);
}
如此而言,对于单纯的常量,最好用const对象或者enums替换掉#defines
对于形似函数的宏可以用inline函数替换掉