static关键字
2018-08-14 本文已影响0人
_gentle
一、面向过程设计中的static
1、静态全局变量
在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。全局变量和静态全局变量的差别在于,全局变量具有外部链接性、而静态全局变量只具备内部链接性。
例如,在文件a.cpp中定义静态全局变量 i 和全局变量 j :
#include<iostream>
using namespace std;
static int i = 1;
int j = 2;//默认为extern
全局变量 j 和静态变量 i 都存放于程序的全局数据区域,它们的生存周期都是程序的整个运行期,但是 j 的作用域为全局作用域,可以通过extern在其他文件中使用,而 i 的作用域为文件作用域,只能在文件a.cpp中使用,在工程下的另一个文件b.cpp中(注意不是在a.cpp中include该文件):
extern int j; //OK
extern int i; // error: i在文件B中不可见
2、静态全局函数
与静态变量类似,当全局函数申明为static的时候,该函数就只具备内部链接性,对外不可见
例如,在a.cpp中
#include<iostream>
using namespace std;
static void f() { //静态全局
cout << "a.cpp" << endl;
}
void f2() {
cout << "a.cpp" << endl;
}
在工程下的另一个文件b.cpp中
#include<iostream>
using namespace std;
extern void f();//error
extern void f2();//ok
int main() {
f();
f2();
}
3、静态局部变量
局部变量声明为static时,其作用域为声明该变量的作用域内。且只定义一次,存储在全局数据区。
#include<iostream>
using namespace std;
void f() {
static int a = 1;
a++;
cout << a << endl;
}
int main() {
f();//2
f();//3
}
总结:
在面向过程中的static关键字的功能:
1.隐藏。当你想将全局变量/函数对工程内的其他文件(translation unit)不可见,以避免冲突时,就将它声明为static的
2.重复使用一个局部变量,但又不想该变量为全局变量时,可以将其设置为局部静态变量
二、面向对象的static关键字
1.静态成员变量
用static修饰的成员变量为静态成员变量,静态成员变量为类的所有实例所共用,跟函数一样必须在类的实现文件中进行定义。
//a.h
#include<iostream>
class A {
public:
static int a;
};
//int A::a = 1; //error
//a.cpp
#include "a.h"
int A::a;//ok
2.静态成员函数
- 静态成员函数也为类的所有实例共享。
- 在实现静态成员函数时,可以不用再次声明为静态的。
- 静态成员函数内部不可以调用非静态成员,因为没有this指针。
(顺便一提,MSVC不允许静态成员函数有默认参数)
//a.h
#include<iostream>
using namespace std;
class A {
public:
static void f();
};
//void A::f() {//ok
// cout << "a" << endl;
//}
#include "a.h"
using namespace std;
void A::f() {
cout << "a" << endl;
}