声明&定义
变量定义的过程包括了声明,如果在多个文件中使用相同的变量,则需将变量及声明分离开来。
1.声明不会分配内存,但是定义会分配相应的内存空间
2.声明可以有很多次,但是定义只能有一次
Static
void getShape() { static double width = 5.0; static double height = 5.3; static double volume; volume = width*height; cout << "volume= " << volume << endl; } void main() { getShape(); system("pause"); return; }
static修饰的变量只能在getShape函数中访问,一般局部变量都存储在栈区,声明周期持续到语句结束。而使用static关键字进行修饰后,变量被存储到静态数据区,声明周期延长至整个程序结束。
静态全局变量不能为其他文件所用,其他文件可以定义相同名字的变量,不会发生冲突。
静态局部变量一般在声明时初始化,如果未被显式初始化,则初始化为0。
void getShape() { static double width; static double height; static double volume; volume = width*height; cout << "volume= " << volume << endl; } void main() { getShape(); system("pause"); return; }
运行结果:volume= 0
static定义全局变量时,若函数定义在头文件中,则所有头文件共享该静态全局变量
//test1.h #pragma once #include<iostream> #include<string> using namespace std; static int H = 5; namespace space_static { void func1() { cout << "func1 in test1.h_ H= "<< H << endl; cout << "func1 in test1. h_ H.address= " << &H << endl; } } //test2.h #pragma once #include<iostream> #include"test1.h" //using namespace std; namespace space_static { void func2() { cout << "func2 in test2: H=" << H << endl; cout << "func2 in test2. h_ H.address= " << &H << endl; } }
在源文件中使用静态全局变量时,返回的是该变量初始的值,并不会返回别的文件修改后的值
在源文件中共享静态变量时,存储内容相同,但物理地址不同
//test1.h #pragma once #include<iostream> #include<string> using namespace std; namespace space_static { static int H = 5; void func1(); } //test1.cpp #include<iostream> #include"test1.h" using namespace std; namespace space_static { void func1() { cout << "func1 in test1.h_ H= " << H << endl; cout << "func1 in test1. h_ H.address= " << &H << endl; } } //test2.h #pragma once #include<iostream> #include"test1.h" //using namespace std; namespace space_static { void func2(); } //test2.cpp #include<iostream> #include"test2.h" using namespace std; namespace space_static { void func2() { cout << "func2 in test2: H=" << H << endl; cout << "func2 in test2. h_ H.address= " << &H << endl; } }
返回结果:
func1 in test1.h_ H= 5
func1 in test1. h_ H.address= 00205008
func2 in test2: H=5
func2 in test2. h_ H.address= 0020500C
结论
头文件中定义函数并共享静态全局变量时,每个文件不会重新创建,而在源文件中贡献时则会重新创建
因此,一般定义静态全局变量时,一般将其放在头文件中。
extern
当某个文件已经创建了全局变量时,可通过extern关键字告诉别的文件已经创建过该全局变量,有效避免重复创建的问题