标签:typename 预处理指令 author 条款04 扫描 efi har 例子 字符串
为了更好的理解C++,我们将C++分解为四个主要次语言:
请记住:
这个条款或许可以改为“宁可 以编译器替换预处理器”。即尽量少用预处理。
编译过程:.c文件--预处理-->.i文件--编译-->.o文件--链接-->bin文件
预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。检查包含预处理指令的语句和宏定义,并对源代码进行相应的转换。预处理过程还会删除程序中的注释和多余的空白字符。可见预处理过程先于编译器对源代码进行处理。预处理指令是以#号开头的代码行。
例:#define ASPECT_RATIO 1.653
记号名称ASPECT_RATIO也许从未被编译器看见,也许在编译器开始处理源代码之前它就被预处理器移走了。
即编译源代码时ASPECT_RATIO已被1.653取代。ASPECT_RATIO可能并未进入记号表(symbol table)。
替换:const double AspectRatio = 1.653;
好处有:多了类型检查,因为#define 只是单纯的替换,而这种替换在目标码中可能出现多份1.653;改用常量绝不会出现相同情况。
常量替换#define两点注意:
const char *authorName = “Shenzi”; cosnt std::string authorName("Shenzi");
类专属常量:
static const int NumTurns = 5;//static 静态常量 所有的对象只有一份拷贝。
万一你编译器不允许“static整数型class常量”完成“in calss初值设定”(即在类的声明中设定静态整形的初值),
我们可以通过枚举类型予以补偿:
enum { NumTurns = 5 };
*取一个const的地址是合法的,但取一个enum的地址就不合法,而取一个#define的地址通常也不合法。
如果你不想让别人获取一个pointer或reference指向你的某个整数常量,enum可以帮助你实现这个约束.
例:
#define CALL_WITH_MAX(a,b) f((a) > (b)) ? (a) : (b))
宏看起来像函数,但不会招致函数调用带来的额外开销,而是一种简单的替换。
替换:
template<typename T> inline void callWithMax(cosnt T &a, cosnt T &b){ f(a > b ? a : b); }
callWithMax是个真正的函数,它遵循作用于和访问规则。
请记住:
对于形似函数的宏,最好改用inline函数替换#defines
const允许你告诉编译器和其他程序员某值应保持不变,只要“某值”确实是不该被改变的,那就该确实说出来。
//例子: char greeting[] = "Hello"; char *p = greeting; //指针p及所指的字符串都可改变; const char *p = greeting; //指针p本身可以改变,如p = &Anyother;p所指的字符串不可改变; char * cosnt p = greeting; //指针p不可改变,所指对象可改变; const char * const p = greeting; //指针p及所致对象都不可改变;
说明:
迭代器的作用就像个 T* 指针;
iterator : 迭代器不能改变,但所指的值可以改变;
const_iterator: 所指对象不可被改变;
//STL例子: const std::vector<int>::interator iter = vec.begin(); *iter =10; //没问题 ++iter; //错误:iter是const std::vector<int>::const_iterator cIter = vec.begin();//作用像const T*, *cIter = 10 //错误:*cIter是const ++cIter; //没问题;
请记住:
永远在使用对象之前先将它初始化。对于无任何成员的内置类型,你必须手工完成此事。
至于内置类型以外的任何其它东西,初始化责任落在构造函数身上,确保每一个构造函数都将对象的每一个成员初始化。
请记住:
标签:typename 预处理指令 author 条款04 扫描 efi har 例子 字符串
原文地址:http://www.cnblogs.com/chenjz1993/p/6763525.html