1.什么时候要用到虚析构函数
在父类成员函数存在虚函数时 析构函数最好选择虚析构 原因:子类可能重写父类方法 子类可能存在空间的申请 为防止此时需要父类帮忙清理 则需要将父类析构函数设置为虚析构
2.c++类型转换 如下常用的两种:
static_cast 静态类型转换
static_cast<目标类型>(标识符)
所谓的静态,即在编译期内即可决定其类型的转换,用的也是最多的一种。
dynamic_cast 子类与父类之间的多态类型准换
dynamic_cast<目标类型>(标识符)
用于多态中父子类之间的多态转换
3.内存对齐 内存对齐不光是可以按照最大值去对齐 也可以进行设置 如下:
设置对齐参数可在结构体struct之前加上#pragma pack(对齐数),在struct之后加上#pragma pack;便可以设置对齐参数。
对齐参数不能任意设置,只能是内置类型已有的字节数,如:char(1)、short(2),int(4),double(8)…不能是3,5…任意数。
4.内联函数与宏的区别
首先说相同点:都是替换,节省时间,方便了程序
不同点:宏是在编译器替换,而内联函数是在函数调用时替换
宏没有类型检查,不如用const,而内联函数可以存在类型检查
内联函数的调用比普通函数快,因为其不用通过函数名称找到函数地址,进而调用程序,而是直接代码段的替换
内联函数是以空间换时间,内联函数一般要求函数不经常调用、且不复杂的代码,例如大的循环和递归则不适用,若是此时调用这种类型的内联函数,系统则会按照正常的函数形式去调用。
注:在类中,h文件中的函数声明且带有函数体,即函数的定义与声明同时存在于h文件中的时候,此时系统会默认其为内联函数
5.指针函数和函数指针 :前者是函数,返回值是指针类型。后者是指针,指向的是一个函数
数组指针和指针数组:前者是指针,指向一个数组。后者是一个数组,数组中装载的是指针
6.模板:函数模板 类模板
函数模板的简单应用
#include<iostream>
using namespace std;
template<typename T>//定义函数模板,T为类型参数;
T cmin(T a,T b)//函数的返回类型和形参类型;
{
T min=a;//保存最大的变量;
if(a>b)
{
min=b;
}
return min;
}
int main()
{
int a,b;
cin>>a>>b;
cout<<"较小的值是:"<<cmin(a,b)<<endl;
return 0;
}
7.栈和堆的区别:
管理方式:前者由编译器管理 后者有程序员控制
大小限制:前者有限制1M到2M,可以去设置 后者最大4G,除去1G内核空间,大约能剩2.9G
能否产生碎片:前者不会因为其先进后出 后者会 因为调用了操作符或者函数释放空间
分配方式:前者 由编译器控制 后者由人管理
分配效率:编译器提供前者支持效率高 而后者只是由几个函数来获取和释放
8.成员变量的初始化~~~~普通变量、static静态变量(编译期初始化)、const常量(只能在初始化列表中进行初始化)、引用型变量(只能在初始化列表中进行初始化)
9.输出程序本身代码 system("type 源.cpp");
10.volatile 修饰的变量是随时都可能会变化的 注:定义这个变量说明,这个变量可能会被意想不到的改变
11.两个队列实现栈 两个栈实现队列 实际上就是两个容器的数据“倒腾” 来实现第三个容器的性质问题