程序员面试宝典第六章总结——预处理、const与sizeof

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必须与函数定义体放在一起才能使函数成为内联函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值