目录
- 关键字
- 基础语法常见问题
-
- 1. 堆和栈的区别
- 2. 数组和指针的区别
- 3. 全局变量和局部变量的区别
- 4. 空指针和悬垂指针的区别
- 5. `sizeof` 与 `strlen` 的区别
- 6. `const` 和 `#define` 的区别
- 7. 文件包含用中括号和引号的区别
- 8. 指针(*)与引用(&)的区别
- 9. 重载(overload)和重写(override)的区别
- 10. c 与 c++ 各自特点
- 11. 什么情况下需要在初始化列表进行初始化?
- 12. derived classes 是否可重新定义继承而来的 `private` virtual 函数?
- 13. 多态类中的虚函数表是 `Compile-Time`,还是 `Run-Time` 时建立的?
- 14. 为什么构造函数不能为虚函数?
- 15. 为什么基类析构函数是虚函数?
- 16. 面向对象技术的基本概念是什么,三个基本特征是什么?
- 17. C++ 中有 `malloc/free`,为什么还有 `new/delete`?
- 18. 头文件中的 `ifndef define endif` 的作用
关键字
static
:控制变量的存储方式和可见性
- 修饰局部变量 该变量存储区由栈区变为静态数据区,其生命周期延长到整个程序执行结束。该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。其作用域仍然是一个局部作用域。
- 修饰全局变量 改变了其作用域的范围,由原来的整个工程可见(
extern
)变为本源文件可见。 - 修饰函数 与修饰全局变类似,改变了函数的作用域。
- C++ 中的 static 修饰成员函数,表示该函数属于一个类而不是属于此类的任何特定对象,不接收
this
指针,因而只能访问类的static
成员变量。修饰成员变量,表示该变量为类以及其所有的对象所有。它们在存储空间中都只存在一个副本,可以通过类和对象去调用。
const
:常量限定符,告知编译器该变量是不可修改的
- 修饰基本数据类型
- 修饰一般常量及数组 可以用在类型说明符前或类型说明符后。
- 修饰指针变量 * 及引用变量 & 位于星号的左侧,指针指向的变量为常量;位于星号的右侧,指针本身是常量。
- 应用到函数中
- 修饰参数 进行常量化,保护了原对象的属性。通常用于参数为指针或引用的情况;
- 修饰返回值 按照"修饰原则"进行修饰,起到相应的保护作用。
- 在类中的用法
- 修饰成员变量 初始化只能在类构造函数的初始化表中进行
- 修饰成员函数 不能修改所在类的的任何变量,重载函数的一个方式。
- 修饰类对象,定义常量对象
- 只能调用常量函数,别的成员函数都不能调用。
extern
: 外部变量/函数声明引用
- 在
C
语言中,修饰变量/函数,表示此变量/函数是在别处定义的,要在此处引用。
调用其它文件中的变量/函数,只需把该文件用#include包含进来即可,为啥要用extern
?因为用extern
会加速程序的编译过程,这样能节省时间。 - 在
C++
中extern
还有另外一种作用,用于指示C
或者C++
函数的调用规范。
在C++
中调用C
库函数,extern “C”
声明要引用的函数。告诉链接器在链接的时候用C
函数规范来链接。主要原因是C++
和C
程序编译完成后在目标代码中命名规则不同,用此来解决名字匹配的问题。
volatile
:易变的
- 易变性。在汇编层面反映出来就是两条语句,下一条语句不会直接使用上一条语句对应的
volatile
变量的寄存器内容,而是重新从内存中读取。 - “不可优化”特性。
volatile
告诉编译器不要对变量进行优化,甚至将变量直接消除,保证写在代码中的指令一定会被执行。 - ”顺序性”。能够保证
volatile
变量间的顺序性,编译器不会进行乱序优化。