程序员笔试知识点总结之C++

来源:互联网 发布:佳为软件 编辑:程序博客网 时间:2024/06/06 06:58

2.预处理、const、sizeof

2.1宏定义

#define SUB(x,y) x-y
#define ACCESS(element,offset,value) *SUB(&element,offset) =value
ACCESS(array[5],4,6);
将会被转化为:*&array[5]-4 = 6;
减号运算符的优先级大于赋值运算符,先处理减法,返回一个数不能进行赋值操作,因此,会产生编译错误。
宏定义不能以分号结尾,预处理器会计算常数表达式的值。

2.2const

1)const在*前还是在*后的问题

const int * a = &b;

const在*之前,修饰指针所指向的变量,即指针指向的内容为常量,不允许对内容进行直接修改

int b =100;

const int * a = &b;

*a = 600; //错误

a是一个仓库管理员,他所进入的仓库(*a)是他没有权限动的,里边有什么就是什么。

如果要改变,可以通过改变b的值 b=200,或者将指针指向别处 int c = 200; a = &c;

const在*后边,修饰指针本身是常量,不能将其指向其他地方,必须初始化

int b=500,c=300;

int * const a; //错误,没有初始化

int * const a = &c; //正确

* a = 600;// 正确

a++; //错误,

a是一个仓库管理员的话,他只能进入某一个指定的仓库,不能进入其他的仓库。

如果const前后都有*的话,表示指针和内容都是常量。

2)const成员函数

把不改变数据成员的函数后加上const关键词标识,提高程序的可读性和可靠性,如果一定要改变,则用mutable修饰成员变量,

如果const在成员函数声明前边,表示函数的返回值是一个常量。

3)和宏定义相比

const有数据类型,宏定义没有,编译器对const有进行类型安全检查,对宏定义只是简单的替换。

2.3sizeof

sizeof返回的是数据类型的大小,int float 4个字节,char 1个字节,指针类型4个字节,short 2个字节,double 8个字节  bool 1个字节

计算结构体的时候需要考虑对齐,是最长数据元素的整数倍,加通过pack预处理指令可以禁止对齐调整,但一般不这样做,这样会降低程序的性能,

class A

{

private:

bool a;

int b;

bool c;

}

A中 的元素所占内存分别为 2  4  2 ,依据最大元素长度补齐, sizeof(A)的大小为12

class B

{

private:

int a;

bool b;

bool c;

}

B中的元素所占内存分别为 4 2 2,依据最大元素长度补齐,sizeof(B)的大小为8

char* ss = "0123456789";

sizeof(ss)的结果为4,指向字符串的字符指针,sizeof(*ss)的大小为1,*ss是第一个字符。

char ss[] = "0123456789";

sizeof(ss)的大小为11,ss是数组,计算到"\0",sizeof(*ss)的大小为1,第一个字符。

char ss[100]="0123456789";

sizeof(ss)的大小为100,strlen(ss)的大小为10,strlen的的参数只能是chaar*型的,结尾必须是“\0”

数组做形参时传递的不是数组,是指针,这时候sizeof就退化为指针的大小。

sizeof 括号内的内容是不被编译的,直接被替换为类型。

int a=8;sizeof(a=6); 执行结束后a的值还是8。

空类、多重继承空类的大小都是1,虚继承涉及虚指针,所以大小为4。

2.4内联函数

内敛函数要做参数类型检查,一般使用情况如下:

(1)一个函数被反复不断的调用;

(2)函数只有简单的几行,且不包括,for,while,switch

内联关键词inline必须与函数定义体放在一起才能成为内联函数,和函数声明放在一起没用