[原创] 程序员面试宝典:第六章 预处理,const,sizeof
1. 求成员在struct中的偏移量:
- #define FIND(struc, e) (size_t) &( ((struc *)0)->e)
- (struc *)0 将常量0强制转化为 (struc *) 指向的地址(将结构体起始位置强制指定为0)
2. 宏定义中,常量如果过长,需要指定使用长整型:
- #define SECOND (60 * 60 * 24 * 365)UL // UL表示使用 unsigned long
3. define MIN(A,B) ( (A)<(B) ? (A) : (B) )
- 带参数宏定义也是简单替换,要更加注意括号
4. const 修饰符:
- const 变量:不可改变,必须初始化,因为初始化之后,就不能变了。
- const 参数:函数内部不可改变这个参数的值。(虽然这个参数本身是拷贝实参)
- const 返回值:用来初始化一个const变量。
- const 指针:int * const p,指针本身指向不可变,指向的内容可变。
- 指向 const 的指针:const int * p,指针本身指向可变,指向的内容不可变。
- const 成员函数:void fun() const,函数的this指针为指向 const 对象的 const 指针,所以不改变类中数据成员,但若将数据成员用mutable修饰,就可以改变了。
- const 成员变量:必须初始化,因为之后无法改变,需要在类外部定义,定义在头文件(因为有可能编译器会进行直接常量替换)
5. char s[] = "0123456789"; sizeof(s) = 11
- 别忘了'\0', 系统自动添加(初始化过程)
7. sizeof操作符:
- 结果类型为 size_t,一般表示 unsigned int
- 可用于:数据类型名,变量,函数
- 作用于变量时,发生类似于宏定义的替换: int a = 6; sizeof(a) --> sizeof(int)
- 作用于函数时,返回值类型
- sizeof(a = 8) a = 8不会被计算! 发生了替换,不会被编译。
- sizeof(int a[100]) 为 400
8. 类占有的空间大小:
- 类的对齐原则与结构体对齐原则相同
- class中,仅包含非static变量(static 存储在数据区)
- 虚函数、虚继承都要用到虚表,增加一个虚指针
9. C++中对于宏的替代选择:
- 内联函数 --> 带参数宏
- const常量 --> 不带参数宏
- 做类型检查 简单替换
10. 内联函数应该在头文件中定义(而不是像一般函数在cpp中定义),因为编译器需要展开。
- inline int fun(int a) {...}