C++笔记
Static关键字作用
基本概念
使用目的:
在 C++ 中,需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见时,可将其定义为静态数据。
存放位置
DATA 段(全局初始化区)存放初始化的全局变量和静态变量;BSS 段(全局未初始化区)存放未初始化的全局变量和静态变量。其中BBS段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
使用static的优势:
- 可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。
- 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的。即静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突。
动态数据vs静态数据:
一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。
静态数据成员
静态数据成员的生存期大于 class 的对象,静态数据成员是每个 class 有一份,普通数据成员是每个 instance 有一份,因此静态数据成员也叫做类变量,而普通数据成员也叫做实例变量。
1 |
|
静态成员函数
静态成员函数不能访问非静态(包括成员函数和数据成员),但是非静态可以访问静态。因静态成员函数不属于类实例,它获取不了实例的信息,而非静态成员能获取全局静态数据,所以它可以调用静态数据。
1 |
|
局部静态变量
实现局部能一直使用一个静态变量,而其他域不能访问的静态变量。
比如,记录一个函数被调用了多少次:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void count()
{
static int num = 0; // 这里就将num放到了静态区,所以不会被局部域销毁;初始赋值只会被执行一次
++num;
printf("called %d\n", num);
}
int main()
{
count(); // called 1
count(); // called 2
count(); // called 3
return 0;
}
静态全局变量
限制全局变量的获取权限,只让当前文件访问,不让其他文件访问
1 | // file1 |
Extern关键字作用
- 允许多个文件访问同一个全局变量/函数
- 在当前文件表明变量/函数来自于其他文件
- 外来函数默认在外面找,不用extern关键字
1 | // file1 |
指针和引用
指针
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。