6.1 宏 (书写时,习惯带上括号)
面试题1:
宏定义时,需要注意操作符优先级问题。宏不是函数,只是在编译前(编译预处理阶段)将程序中的有关字符串替换成宏体。
- 懂得在宏中小心地把参数括号括起来。很重要!!
因此ACCESS_BEFORE(array[5], 4, 6); 在编译前被替换成了*&array[5]-4=6; 因为减号的优先级大于等号,所以先计算array[5]-4,由于减号已经返回了一个数而不是合法的值,所以编译时会报错。
面试题2:
UL 无符号长整型
#define SECOND_PER_YEAR (60*60*24*365)UL
面试题3:略。
6.2
面试题1:
const什么对象,就要对相应的对象初始化。 例如
int b=500;
const int* a=&b;// 将a所指向的内存值设为常量,因此必须要对*a初始化。但是指针a不是常量,所以a可以改变
int const *a=&b;//const 右边全部是常量,和上述一样。
int *const a=&b; //此时指针a是常量,所以必须要对a初始化,而且以后不能改变,但是a所指向的内容可以改变。可以通过改变b=200的方式改变a所指向的内容。
const int* const a=&b;//这里指针a和指针a所指向的内容都不可以发生改变。
const成员函数
类中有些数据成员只是提供“只读”功能,不能修改该数据的值,这样家让const关键字,显然可以提高程序的可读性,另外,可以挺高程序的可靠性,已定义const的成员函数,不能修改数据成员。例如下图:
程序都无法通过编译。 另外,关键字const必须用同样的方式重复出现在函数实现里,否则编译器会把他看成一个不同的函数。
面试题2:
const和#define的区别在于 const可以安全检查,在调试的时候可以调试。
const定义的变量称为”一个不能被改变的普通变量“, 他被存在内存中的某个地方,因此下面做法是错的
const bufsize=10;
char buf[bufsize];
面试题 3: 略。
6.3
面试题1:
char ss[]={'0','1','2','3','4','5','6','7','8','9'};
char ss1[]="0123456789";
注意:上述两句语句不一样,ss表示有10个字符的字符数组。ss1为字符串,最后以‘\n’结尾。 因此:sizeof(ss)是10,sizeof(ss1)是11。
在默认情况下,为了方便对结构体或者对类的访问和管理,当结构体内的元素的长度小于处理器的位数时,便以结构体里面最长的数据元素对齐单元,也就是说,结构体的长度一定是最长的数据元素的整数倍。
数据对齐:数据所在的内存地址必须是该数据长度的整数倍。
面试题2:
#pragma pack(1): 设为1字节对齐。
面试题3:
类在内存中的大小,与他所包含的成员函数无关,但是如果有虚函数,则有关:
class A1
{
public:
int a;
static int b;
int re(){ return 0;}
A1();
~A1();
};
sizeof(A1):4
class A1
{
public:
int a;
static int b;
vitural int re(){ return 0;}
A1();
~A1();
};
sizeof(A1):8
上述无论多少个虚函数,他的大小都是8个字节。 static被存在全局数据区,而sizeof计算栈中分配的大小。当时用了一个结构类型或变量时,sizeof不能返回被动态分配的数组或外部的数组的尺寸。
面试题4: 略。
面试题5:略。
面试题6:略。
面试题7:
sizeof()括号里的在编译阶段后,将被改为类型。所以 需要注意的是,要找准类型,sizeof(指针),和sizeof(*指针)不一样。例如:
char* a;
sizeof(a)为4;sizeof(*a)为1。
面试题8:
class Base
{
public:
//int x; A
Baes(){}
~Base(){}
virtual void f(int i){}
};
class Derived:public Base
{
public:
Derived(){}
~Derived(){}
virtual void g(int i){}
};
在不加A的情况下,sizeof(Base)和sizeof(Derived)都是4。加了A之后,sizeof(Derived)为8。
注意要和11.3中面试题2一块看,继承和虚继承的sizeof情况不一样。
面试题9:略。
面试题10:略。
面试题11:
空类占1个字节,单一继承的空类和多重继承的空类都占一个字节。
6.4
面试题1: 内联函数和宏定义的差别
内联函数:内嵌代码,不需要中断处理。关键字inline必须与函数定义体放在一起才能使函数成为内联函数。