10.1.修饰局部变量,保持变量内容的持久。
1 #include"pch.h"
2 #include <iostream>
3 using namespace std;
4 void func() {
5 static int cnt = 1;
6 cout << "cnt changed" <<" "<<cnt++ <<" "<<"times" << endl;
7 }
8 int main()
9 {
10 for (int i = 0; i != 6; i++)
11 func();
12 return 0;
13 }
声明为static的局部变量将存储在静态存储区,随程序的结束后销毁,而不是函数结束后。虽然static修饰的局部变量仍然“生存”,但是它不能脱离作用域外活动。
10.2.修饰全局变量和普通函数,相对于其他源文件,隐藏自身。
static修饰全局变量和普通函数只能被包含本文件的文件使用,隐藏了自身。
在src.cpp中有如下:
1 #include"pch.h"
2 #include <iostream>
3 //#include "src1.cpp"
4 using namespace std;
5 void func() {
6 static int cnt = 1;
7 cout << "cnt changed" <<" "<<cnt++ <<" "<<"times" << endl;
8 }
9 int main()
10 {
11 for (int i = 0; i != 6; i++)
12 func();
13 return 0;
14 }
在src1.cpp中有如下:
1 #include"pch.h"
2 #include <iostream>
3 using namespace std;
4 static void func() {
5 }
这两个文件编译的时候可以通过,这里很好的体现了以下两点:
(1) 其他文件中可以定义相同名字的函数,不会发生冲突(声明或者定义为static)。
(2) 静态函数不能被其他文件所用。
当然,你不能把src1.cpp包含到src.cpp中去,如果你这样做了,那么无论你是否加上了static都会重复定义!
10.3.类的静态成员
1 #include"pch.h"
2 #include <iostream>
3 using namespace std;
4 class Static {
5 public:
6 //静态成员可以作为形参默认值
7 //静态成员的定义可以是不完全类型
8 void do_something(int v = value) {
9 cout << "value can be formal parameter" << endl;
10 }
11 static void do_annother() {
12 cout << "Definition static function" << endl;
13 }
14 static void do_other(const int &a);
15 private:
16 static int value;
17 //静态变量类内初始化必须设为constexpr
18 static constexpr int value_1 = 50;
19 int value_2;
20 };
21 //类外定义不能加上static限定符
22 int Static::value = 50;
23 constexpr int Static::value_1;
24 void Static::do_other(const int &a=value_1)
25 {
26 //错误,不允许访问或者修改非static成员,因为这些成员必须于特定对象绑定!
27 cout << value_2;
28 }
29 int main() {
30
31 }
(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。
(2)不能将静态成员函数定义为虚函数。
(3)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器内部如何解决:name-mangling 用以生成唯一的标志。