先从内存说起,最精简的嵌入式系统也要划分出以下这些section:
代码段
全局数据段
堆
栈
再说c++里面的static关键字,分五个部分:
1. 静态全局变量
2. 静态局部变量
3. 静态数据成员
4. 静态非成员函数
5. 静态成员函数
1. 静态全局变量
static关键字放在全局变量前面,这个全局变量就是静态全局变量了。
static int A; 后面A就是1类型的静态全局变量的代名词了
(1) A所占用的内存在全局数据段
(2) 要想使用A的文件就要先在文件内声明A,不声明则对于该文件A既不可见亦不可用
extern int A; // 声明static int A
(3) 在声明了A的文件中,允许定义A同名变量,但是要注意编译器允许并不意味着不会出现运行时错误,建议还是不要做这样的定义。
2. 静态局部变量
static关键字放在局部变量前面,这个局部变量就是静态局部变量了。
static int B; 后面用B代名2类型的静态局部变量
(1) 加上了static关键字,B就从栈上搬家搬到了全局数据段,并在程序运行期内始终驻留全局数据段
(2) 加上了static关键字,B的作用域并不发生改变
举个例子:
#include <iostream>
void sum();
void main()
{
int i;
for(i=0; i<10; i++)
{
if (i % 2)
sum();
}
int B;
B = i;
cout << "B = " << B << endl;
}
void sum()
{
static int B = 0;
B++;
cout << "static B = " << B << endl;
}
执行结果是:
static B = 1
static B = 2
static B = 3
static B = 4
static B = 5
B = 10
3. 静态数据成员
static关键字放在数据成员前面,这个数据成员就是静态数据成员了。
(1) 静态数据成员所占的内存在全局数据段
(2) 静态数据成员只有一份拷贝,无论类有多少个实例。我们知道声明不会分配空间,因此,不允许在类声明的时候初始化静态数据成员。但是也因为只有一份拷贝,因此适用于对象的共同属性变量,节省空间又方便修改。
(3) 初始化静态数据成员的方法
class A
{
public:
static int s_a;
... ...
private:
... ...
};
int A::s_a = 100;
(4) 静态数据成员是属于类的,即使没有实例,一样可以被访问,其也一样遵从public,protected,private规则
(5) public的静态数据成员a可以通过下面两个方法访问
A::s_a 或者 a.s_a (a是A的一个实例)
4. 静态非成员函数
在非成员函数的前面加上static,非成员函数就变成了静态非成员函数。
(1) 在声明了静态非成员函数的文件内,可以使用静态非成员函数,而对于其他文件,静态非成员函数是不可见的
(2) 因为(1),所以不同文件可以有同名的静态非成员函数
5. 静态成员函数
成员函数前面加上static,成员函数就变成了静态成员函数。
(1) 静态成员函数只属于它所在的类,而不属于、不联系任何一个类的实例,因此既不能被this指针指向,也不能通过this指针访问类的其他非静态数据成员
(2) 静态成员函数能调用的只有类的其他静态成员函数,以及类的静态数据成员
(3) 但是类的其他非静态成员函数可以访问静态成员函数,public的静态成员函数还可以被类外的代码访问调用
(4) 调用方法
类名::静态函数名(参数)