extern
1、声明外部变量
extern 用来修饰变量或者函数名,用以在一个文件中定义,但是可以在其他文件中进行使用的。
例如在A文件中定义了 全局变量 int mm=0;你在另一个文件B中也定 定义了 int mm=0; 编译时时候不会出错,因为编译时以文件为单位作用域在本文件中。但是在链接是后出错,因为他会将多文件进行合并生成obj 全局变量的存储空间合并为一块儿,导致重名;如果加上extern 的话就会链接放行,认为是一个变量。
2、在C++文件中调用C方式编译的函数
C方式编译和C++方式编译相对于C,C++中新增了诸如重载等新特性,编译时候会生成一个由函数名参数组成的中间函数名用来检查重载特性。而C语言编译不会这样。导致C++中如果调用C语言接口会不认识,那么extern ‘C’ 就有用了告诉编译器,这段代码用C编译器编译。那么自然而然调用的时候就认识了。
static
1.静态全局变量有以下特点:
• 该变量在全局数据区分配内存;
• 未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);
• 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;
2.
• 静态成员函数不能访问非静态成员函数和非静态数据成员;
• 由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
virtual
1.多态实现
2.包含一个或多个纯虚拟函数的类被编译器识别为抽象基类。抽象基类不能被实例化,一般用于继承。抽象基类只能作为子对象出现在后续的派生类中
3.虚继承
在多继承下,虚继承就是为了解决菱形继承中,B,C都继承了A,D继承了B,C,那么D关于 A的引用只有一次,而不是 普通继承的 对于A引用了两次……
格式:可以采用public、protected、private三种不同的继承关键字进行修饰,只要确保包含virtual就可以了。
class A
{
void f1(){};
};
class B : public virtual A{
void f2(){};
};
class c:public virutal A{
public:
void f3();
};