[原创] 程序员面试宝典:第六章 预处理,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) {...}
 
原文地址:https://www.cnblogs.com/icemoon1987/p/2709568.html