最粗略的理解
const:存储的内容不变
static:存储的位置不变
参考了好多篇其它博客,但是找不到了……
(一)const
常量限定符
一、const 修饰基本数据类型
1.修饰一般常量及数组
1 | const int a=10; int const a=10; |
2.修饰指针变量* (重点-常量指针、指针常量)
1 | const int* a = & [1] //指针指向的数据为常量,不能更改内容 //常量指针 |
常量指针:指针指向的数据为常量,不能变
指针常量:指针指向的地址不能变
3.修饰引用变量&
1 | int const &a=x; |
二、函数与 const
1. 作为参数的 const 修饰符
不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容
2. 作为函数返回值的 const 修饰符
三、类与 const
1. 类的 const 数据成员
只在某个对象生存期内是常量,而对于整个类而言却是可变的
2. 类的 const 成员函数(常量成员函数)
类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(非静态数据成员)作改变
1 |
|
3. const 对象与 const 成员函数
const 成员函数:可以访问非const对象的所有数据成员,也可以访问const对象内的所有数据成员
非const 成员函数:可以访问非const对象的所有数据成员,但不可以访问const对象的任意数据成员
(二)static
1. 静态全局变量
在全局数据区分配内存,不是在栈区,未经初始化的静态全局变量会被自动初始化为0
- 全局变量:
只需在一个源文件中定义,就可以作用于所有的源文件
其他不包含全局变量定义的源文件需要用 extern 关键字再次声明这个全局变量
- 静态全局变量:
作用于定义它的文件里,不能作用到其它文件里,具有文件作用域
比如,两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量
2. 静态局部变量
在全局数据区分配内存,不是在栈区,未经初始化的静态全局变量会被自动初始化为0
静态局部变量被首次初始化以后,函数调用不再进行初始化
实现在多次函数调用时,对变量的值进行保存
3. 静态函数
类似于静态全局变量,只能在声明它的文件当中可见,不能被其它文件使用
4. 类与 static
静态成员数据、静态成员函数被该类的所有对象所共有的
静态成员函数 不具有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数
注意
- static成员变量:不能在类的内部初始化,在类的内部只是声明,定义必须在类定义体的外部
- const成员变量:也不能在类定义处初始化,只能通过构造函数初始化列表初始化
(三)extern
extern 可以置于变量或者函数前,表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义
(感觉有点像头文件的功能)
extern 也可用来进行链接指定(在C++环境下使用C函数时)
extern "C" void fun(int a, int b);
告诉编译器在编译fun这个函数名时,是按着C的规则而不是C++
C++ 编译函数名时,为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称
在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,按照C的规则编译函数名