1. delete & delete[]
在基础类型中作用是一样的,都是释放目标指向的内存delete 只会调用第一个地址的析构 但是在自定义类型中例如对象数组delete[]会逐一释放每个地址指向的内存调用每个地址的析构
2. 纯虚函数与虚函数
virtual void area() = 0;
void area() override { cout << "this is b.area()" << endl; }
3. 有哪几种情况只能用intialization list 而不能用assignment
在执行构造函数初始化成员变量的时候
4. C++是不是类型安全的
静态类型语言会在编译时强行进行类型检查
5. main 函数执行以前,还会执行什么代码?
初始化全局变量静态变量 设置执行环境,内存堆栈等 清理未初始化的全局变量 声明入口函数并调用init函数 处理命令行参数
6. 描述内存分配方式以及它们的区别?
静态分配、动态分配 前者会在编译阶段确定好内存大小并以固定大小分配地址,可分配在栈或者堆中,系统可以执行进行管理释放 后者只有在运行时才能确定内存大小,使用一般分配在堆中,需要手动管理释放,相较于静态分配更灵活
7. 请说出const与#define 相比,有何优点?
const 是常量,被定义在全局区,有地址,可控,更安全 而#define 是一种字符串替换,再预编译阶段对需要的字段进行替换,相较于const更易于维护
8. 数组与指针
指针代表指向的内存地址 数组就是指针,只不过数组代表一串连续的指针,从数组索引0位置开始
9. int (*s[10])(int);
int (*s[10])(int);
int i = s[0](1);
10. 内联函数 inline
内敛是编译时 作用类似于宏,替换函数调用为函数体内容即内敛展开 其中一般不包括循环、递归等复杂操作
类内隐性内敛 类外显性内敛
内敛展开是会进行安全检查和自动类型转换 缺点: 代码膨胀 inline函数改变需要重新编译
ps: 虚函数可以内敛,但表现为多态时不能内敛