1. 指针和引用的区别
(1)本质:指针是地址,引用是别名。
(2)对象绑定:指针可以为空,如果前面不加const修饰,可在运行过程中改变其指向的对象;引用不能为空,必须初始化,一旦与对象绑定则不可改变
(3)对象访问:指针是间接访问对象,引用是直接访问对象
(4)占用空间:指针的大小在32位机器上4个字节,64位机器上8个字节;引用的大小为其绑定对象的大小
(5)运算符:指针和引用的++运算符意义不同
(6)安全性:引用更加安全,指针使用灵活,但容易产生野指针
2. const和define的区别
(1)本质:const定义常量,define是宏定义,表示字符串的替换
(2)内存:const修饰的变量为全局只读变量,放在静态存储区,而define在内存中有多个拷贝
(3)类型与安全:const修饰的变量具有特定的类型,会进行安全检查,而define宏没有类型,不会进行安全检查
(4)值的确定:const在编译阶段会确定其值,而define会在预编译阶段进行替换
3. define和inline的区别
(1)本质:define是宏定义,表示字符串的替换,而inline是由编译器决定
(2)define在预编译阶段进行替换,不会进行安全检查
(3)inline在编译阶段进行嵌入,会进行安全检查,短小函数简单实用,不需中断,可加快程序运行速度,而对于较大函数,编译器可选择不进行展开
4. malloc/free和new/delete的区别
(1)本质:malloc/free是C/C++的标准库函数,使用的时候需要包含stdlib.h,而new/delete是C++的运算符,它们都可以用于动态分配和释放内存
(2)分配内存:malloc/free只能为内部数据类型分配和释放内存,而对于用户自定义的数据类型,malloc/free是标准库函数,不能调用构造函数和析构函数,因此需要new/delete来实现
(3)返回值:malloc的返回值是void*类型,使用时需要强制类型转换,new可以自动识别所需类型和内存大小
(4)安全性:malloc只关心申请内存大小,而不关心类型,不会进行类型安全检查,new内置了sizeof、 类型转换和类型安全检查功能
5.static关键字的作用
(1)生命周期:static修饰的变量和函数作用域是全局的,静态变量存放在静态存储区
(2)作用范围:
- 函数:静态变量的作用域只在函数内,且静态变量的值只初始化一次,下次调用仍保持上次的数值
- 模块:静态变量和静态函数可以被模块内的所有函数访问和调用,模块之外若要访问需使用作用域运算符
- 类:静态成员变量属于整个类所有,不属于任何对象,使用sizeof计算值不包含其大小;静态成员函数属于整个类所有,不接受this指针,只能访问静态成员变量
6. const的作用
(1)const与变量:可以定义一个常量,通常需要初始化
(2)const与指针:
- const int *p; p可变,p指向的对象不可变
- int const *p; 同上
- int * const p; p不可变,p指向的对象可变
- const int * const p; p不可变,p指向的对象同样不可变
(3)const与函数:const可修饰函数的形参,输入参数可以是常量也可以是普通变量,在函数内部不会改变
(4)const与类:
- const修饰成员变量,表示这是一个常量,只能在初始化列表中赋值
- const修饰成员函数,表明这是一个常函数,不能修改类的任何成员变量,同时可以访问类的const成员,而其他函数不可以
- const修饰成员对象,表明这是一个常量对象,不能修改类中的任何成员,同时只能调用const函数,因为其它函数有可能改变成员值
(5)不能使用const与static同时修饰类的成员函数
- const修饰的成员函数不改变类中的成员,默认带有const this指针
- static修饰的成员函数属于类,而不属于对象,不允许带有this指针
posted on
浙公网安备 33010602011771号