1. static关键字
-
静态变量
-
用法: 在变量前加上 static 关键字,变量就变成了一个静态变量
-
存储位置: 静态存储区,在程序的整个运行期间都存在
-
初始化: 未经初始化的全部静态变量都会被初始化为0((对于自由变量初始化的值是任意的,除非是显式的初始化)
-
作用域: static 不会改变变量的作用域
全局静态变量:作用域仍为全局作用域,全局静态变量在声明他的文件之外不可见,也就是说是在定义之处起,到文件结尾
局部静态变量:作用域仍为局部作用域,当定义它的函数快结束的时候,作用域结束。在作用域外我们无妨访问该变量,但是其并不会被销毁,直至我们再次调用该函数,该变量值不变。
-
-
静态成员
- 在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。对多个对象来说,静态数据成员只存储一处,供所有对象共用
-
静态成员函数
-
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员函数的引用不需要用对象名
静态成员函数在类初始化的时候就会加载到内存中,即使实例化多个对象,在栈中的静态成员函数也是只有一个,所有对象共享这一个静态成员函数,所以说这个函数是属于类的一个函数而不是属于对象的函数。
静态成员函数中不存在this指针,所以其不能实例化
-
在静态成员函数中不可以直接引用类中声明的 非静态成员,可以引用类中声明的 静态成员。如果静态成员函数要引用静态成员,可以通过对象来引用。
-
-
静态函数
-
在函数的返回类型前加上关键字 static,函数就会被定义成静态函数;
-
函数的定义和声明在默认情况下都是 extern 的,但静态函数只在声明他的文件中可见,不能被其他文件使用,因此也不会和其他文件中的同名函数起冲突。
warning: 不要在头文件中声明static全局函数,也不要在
cpp
文件中声明非static全局函数。
-
2. const关键字
-
普通成员变量
- 在一个普通变量类型前加 const 关键字,该变量就会被定义成一个常量,对一个常量赋值是不被允许的行为,所以常量的值是不能改变的。
-
指针
const 修饰指针有三种情况:
-
常量指针: const 修饰指针指向的内容,则内容为常量,不可改变,但指针的指向可以改变
int a = 21, b = 25; const int *p = &a; *p = 32; //错误 p = &b; //正确
-
指针常量: const 修饰指针,则指针为不可变量,不可更改其的指向
int a = 21, b = 25; int* const p = &a; *p = 32; //正确 p = &b; //错误
-
常量指针常量: const 修饰指针和指针指向的内容,则两者均不可变
int a = 21, b = 25; const int* const p = &a; *p = 32; //错误 p = &b; //错误
-
背诵口诀 "左定值,右定向,const修饰不变量"
-
-
函数参数
-
当用 const 修饰参数指针时,可以防止指针被恶意篡改
void Cpf(int *const a) { cout<<*a<<" "; *a = 9; } int main(void) { int a = 8; Cpf(&a); cout<<a; // a 为 9 system("pause"); return 0; }
-
自定义类型的参数传递,需要创建临时对象赋值参数,需要调用拷贝构造函数,比较浪费时间,采用 const 外加引用传递的方式
-
-
成员函数
- const 修饰成员函数表明此函数不会对函数做任何修改。事实上,入股确认成员函数不会对对象成员作任何修改,都应该用 const 修饰,这样无论是 const 对象还是普通对象都可以调用该函数。
const 和 static 不能同时使用,因为静态成员函数中不含有this指针,即不能实例化,而 const成员函数 需要具体到某一实例
3. virtual关键字
-
多态
多态主要分为静态多态和动态多态。静态多态主要靠重载实现,在编译时就已经确定。动态多态使用虚函数机制实现,在运行时动态绑定。在一个成员函数前添加 virtual 关键词即可将该函数声明为虚函数。
-
virtual 不可与 static、const 等关键词一起使用。
- static 函数不属于任何类对象或者实例,因此添加 virtual 也没有意义
- 虚函数依靠vptr和vtable来处理,vptr是一个指针,在类的构造函数中创建生成,并且用智能指针this来访问塔,静态成员没有this指针,所以也无法访问vptr。
有关虚函数的介绍请移步:
https://blog.csdn.net/Kimmich6/article/details/119255547