c++多态
多态分为编译时多态与运行时多态,
编译时多态是在编译时确认调用函数的类型,比如说函数重载。
运行时多态是在函数运行时才确认调用的是哪一个函数,主要是用虚函数实现的。
C++里一些关键字的作用:static、const、volatile、extern
static的作用
- 面向过程
一个可重定位目标文件都有一个的符号表,每个变量或函数都会被定义成一个符号,包括全局符号、外部符号、局部符号。如果被static修饰,那么改符号就会变为局部符号,仅可被该文件所引用。
static修饰局部变量不在栈中存着。会被分配到.data段或者.bss段上,会被加载到全局变量区。
- 面向对象
无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问,是被所有对象共有的。
可以用俩个::访问。
const的作用
防止变量被修改
const在指针左面表示被指物是常量,出现在指针右面,表示指针自身是常量。
extern的作用
以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义
volatile
确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
csapp里在介绍如何编写信号安全的函数的时候,有一条就是用volatile修饰全局变量,比方说,阻塞error。
inline
内联函数在编译期间对调用的地方替换成函数代码,对于频繁调用的函数使用内联,会提高效用。
virtual与构造函数
构造函数为什么不能为虚函数?
(1) 从存储空间角度,虚函数相应一个指向vtable虚函数表的指针,但是这个指向vtable的指针是存储在对象的内存空间的。假设构造函数是虚函数的,就须要通过vtable来调用,但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数;
(2) 使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到相应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候可以变成调用子类的那个成员函数。而构造函数是在创建对象时自己主动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数;
析构函数为什么要虚函数
直接的讲,C++中基类采用虚析构函数是为了防止内存泄漏。具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。假设基类中采用的是非虚析构函数,**当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。**那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏。所以,为了防止这种情况的发生,C++中基类的析构函数应采用虚函数
纯虚函数
=0;
通常用在父类调用这个函数无意义的情况下,比如说工厂模式中,工厂一般要生产产品类这一种基类,产品类会继承基类的函数,
new和malloc的区别?
new是c++的关键字,返回的是对象类型的指针
malloc是c的库函数内存分配成功后返回void* 需要自己强制转化。