static(静态)变量
来源:互联网 发布:三维人像建模软件 编辑:程序博客网 时间:2024/05/29 16:14
1.静态变量有什么作用
static全局变量和普通的全局变量的区别在于static全局变量只初始化一次,下一次的运算依据是上一次的结果值。static()函数与普通函数的区别在于作用于不一样,static()函数只在一个源文件中有效,不能被其他源文件使用。
在C++中,在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。静态数据成员有以下特点:
1)对于非静态数据成员,每个类对象都有自己的复制品。而静态数据成员被当作是类的尘缘。无论这个类的对象被定义了多少次,静态数据成员在程序中也只有一份复制品,由该类型的所有对象共享访问;
2)静态数据成员存储在全局数据区。不属于特定的类对象,在没产生类的实例时,程序员也可以使用它;
3)静态数据成员和普通数据成员一样遵从public、protected、private访问规则;
4)static成员变量的初始化是在类外,此时不能再带上static的关键字private。protected的static成员虽然可以在类外初始化,但是不能在类外被访问。
静态数据成员不具有this指针,不能访问属于类对象的非静态数据成员,也无法访问非静态数据成员,它只能调用其余的静态成员函数。
附:为什么static变量只初始化一次?
对于所有对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。
存放在静态区域的变量的生命周期一般比较长,一般与整个源程序“同生死,共存亡“,所以只需要初始化一次,而自动变量由于存放在栈区,一旦过程结束,就即刻被销毁。
例如:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
static int val = i++;
cout << "val = " << val << endl;
}
int main()
{
fun(0);
fun(1);
fun(2);
return 0;
}
程序输出为:
0
0
0
void fun1(int i)
{
static int val = i++;
val = i++;
cout << "val = " << val << endl;
}
int main()
{
fun1(0);
fun1(1);
fun1(2);
return 0;
}
程序输出为:
1
1
2
因为当调用fun1(0时,由于val被声明为static,所以定义语句只执行一次,此时val = i++,val的值为0,i的值变为1,执行第二语句val=i++后,此时val的值为i的初值为1,接着i的值变为2,所以第一次调用时输出为1.当调用fun(1)时,因为val是静态变量,具有记忆功能,所以会跳过定义语句,执行val=i++语句,所以val的值为1,而此时i的值变为2,所以第二次调用时输出为1.后面同样如此。
另外:在头文件中不建议定义静态变量,不然会引起空间浪费或者程序错误。所以不建议在头文件中定义任何变量,当然也包括静态变量。
- static(静态)变量
- static 变量(静态变量)
- 静态变量详解(Static)
- static静态变量(静态全局和静态局部)
- 请慎用全局静态变量(static)
- C#中静态变量(static)
- object-c的静态变量(static)
- static(静态)变量的作用
- C++ static variable(静态变量) 学习
- static定义静态变量
- static 静态变量
- 静态变量java static
- static 静态局部变量
- 静态变量static
- static静态变量
- 静态变量 static
- php static 静态变量
- static静态成员变量
- 局域网内服务端提供一个目录,客户端选择指定文件并进行下载
- linux下c++sleep函数
- Git常用操作系列(2)
- bzoj2391Cirno的忧郁 treap+三角剖分
- Java基础
- static(静态)变量
- C#和C++中类实例化的差异——从C#到C++爬坑ing
- 题目1490:字符串链接
- MyBatis基本操作
- [bzoj4832]抵制克苏恩 概率dp
- 文本压缩过滤器实现
- Linux账号与身份管理
- 常见排序算法整理(三)----归并排序、快速排序
- Java NIO流--二