10.static关键字

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 用以生成唯一的标志。   

posted @ 2019-06-10 09:34  Royzzzzz  阅读(165)  评论(0编辑  收藏  举报