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.静态成员函数

//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;
}
上一篇下一篇

猜你喜欢

热点阅读