static和extern
static作用
static的作用主要体现在两个方面:
- 作用域
- 生存期
静态局部变量
作用域:函数内部。
生存期:整个程序运行期间。
1 void fun() 2 { 3 static int i = 1; 4 }
静态全局变量
作用域:本文件内部。
生存期:整个程序运行期间。
static int n = 5; int main () { return 0; }
类静态数据成员
类静态数据成员一个类只有一份实例,可以通过对象和类来使用。
class Test{ public: //静态数据成员 static int a; }; //初始化 int Test::a = 1; int main() { Test t; // 通诺对象使用 t.a = 2; // 通过类使用 Test::a += 1; }
静态函数
作用域:本文件内部。
生存期:整个程序运行期间。
static void f() { } int main () { }
类静态成员函数
静态成员函数也是属于类的,它并不属于任何对象,可以通过类使用,也可以通过对象使用,它是不能访问非静态数据成员的,在c++中静态成员函数主要用来访问静态数据成员。
- 静态成员函数不能调用非静态成员函数,但是反过来是可以的
- 静态成员函数没有this指针,也就是说静态成员函数不能使用修饰符(也就是函数后面的const关键字)
- 静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。
C程序内存布局
参考:https://www.cnblogs.com/418ks/p/10802184.html
extern的作用
利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数。
在同一个文件
使用了extern修饰函数和变量,就不需要在使用之前对函数和变量有声明。
1 #include<stdio.h> 2 3 int func(); 4 5 int main() 6 { 7 func(); //前面有声明可以 8 printf("%d",num); //后面的全局变量有extern可以 9 return 0; 10 } 11 12 extern int num = 3; 13 14 int func() 15 { 16 printf("%d\n",num); 17 }
在不同文件
这可以在文件2中使用文件1中的变量和函数。
1 //文件1 2 3 extern int num = 3; 4 5 extern int func() 6 { 7 8 } 9 10 //文件2 11 #include <stdio.h> 12 int main() 13 { 14 func(); 15 printf("%d",num); 16 return 0; 17 } 18
菜鸟手记。