目录
- 1. 编译过程
- 2. 宏定义和const
- 3. sizeof和strlen,char * 和 char[]的区别
- 4. static关键字
- 5. C和C++的区别
- 6. memcpy,memset和strcpy
- 7. 大端、小端
- 8. volatile与register修饰符
- 9. C++类型转换
- 10. 指针和引用
- 11. C++中的智能指针
- 12. 内存泄漏?避免的方法?
- 13.为什么析构函数必须是虚函数?为什么默认的析构函数不是虚函数?
- 14. 函数指针
- 15. 静态函数和虚函数的区别
- 16. 重载和覆盖(重写)
- 17. 虚函数和多态
- 18. 函数的调用
- 19. new/delete和malloc/free的区别
- 20. 构造函数,拷贝构造函数,赋值构造函数
1. 编译过程
预处理:预处理相当于根据预处理命令组装成新的C程序(头文件展开,宏定义替换等),不过常以.i为扩展名。
编译: 将得到的.i文件翻译成汇编代码.s文件。
汇编:将汇编文件翻译成机器指令,并打包成可重定位目标程序的.o文件,该文件是二进制文件,字节编码是机器指令。
链接:将引用的其他.o文件并入到我们程序所在的.o文件中,处理得到最终的可执行文件。
2. 宏定义和const
2.1 宏定义的使用
宏定义本身可以理解为字符的替换,在实际编程中有很多的应用,宏可以带参数,如:
- 宏定义给某个数bit3置位和清零
// An highlighted block
#define SET(a,b) a|(0x1<<b);
#define CLR(a,b) a&(~(0x1<<b));
- 宏定义一个求两个数最小值的函数
#define MIN(A,B) ((A)>(B))?B:A
- 宏定义求最大值函数,不能使用 >,<,if,语句
//宏定义参数需要用括号括起来,且表达式内部不能有空格
#define max(a,b) (((a)-(b))&(1<<31))?(b):(a)
#define max(a,b) (a-b)==abs(a-b)?a:b
#define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b):(a))
- 交换两个数的函数
#define swap(a,b) {a=a+b;b=a-b;a=a-b;}
2.2 const
常量定义必须初始化,对于局部对象,常量存放在栈区,对于全局对象,常量存放在全局/静态存储区。对于字面值常量,常量存放在常量存储区。
1. const的含义
const int a; //整型常量
int const a; //整型常量
const int *a; //指向整型常数的指针(指向的常数不可修改,指针本身可以修改)
int* const a; //指向整数的常指针(指针本身不可修改,指向的整数可以修改)
int const* a const; //指向常量的常指针(都不可修改)
2. 为什么使用const?
(1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的)。
(2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
(3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
3.const修饰成员函数的目的
const修饰成员函数表明该函数调用不会对对象作出任何更改,事实上,如果确认不会对对象作出修改就应该加上const限定,这样无论是const对象还是普通对象都可以调用该函数。
2.3 宏定义和const的区别(定义常量)
- 宏定义是在编译之前进行的,而const是在编译阶段处理的
- 宏定义不占用内存,而const定义的常量占用内存单元
- 宏定义没有具体的数据类型,而const有具体的数据类型
- 宏定义可以带参数进行定义,而const不能带参数定义
3. sizeof和strlen,char * 和 char[]的区别
- sizeof是运算符,strlen是函数
- strlen只能用char*做参数,且必须以"\0"结尾,sizeof可以用类型或函数做参数
- 数组做sizeof的参数不退化,做strlen的参数时退化为指针
- sizeof在编译时确定类型占内存的大小(大部分编译器),因此sizeof(x)可以用来定义数组维数,可以通过以下方式确定数组长度
int num[10] = {
0,1,2,3,4,5,6,7,8,9 };
int len1 = sizeof(num); //len1 = 40
int len2 = sizeof(num) / sizeof(num[0]); //len2 = 10
- strlen在运行时计算字符串的长度
char str[20] = "0123456789";//存放在堆栈区,可以修改
char *p_str = "0123456789"; //存放在常量区,不可修改
char *p = str;
int len3 = strlen(str); //len3 = 10;
int len4 = sizeof(str); //len4 = 20;
int len5 = sizeof(<