static用法
a.静态局部变量,成为静态局部变量(具有记忆功能和全局存储权限)
b.静态全局变量(限制对应全局变量被被其他文件调用)
c.静态函数
d.静态类成员(标识此成员属于类而非属于某个特定对象)
1.静态局部变量
1.1静态局部变量在函数内定义,具有静态存储期限而不再是自动存储期限,由于静态存储期限的变量具有永久的
存储单元,所以在全部程序存储期间都会保存变量的值,虽然退出函数后变量仍然存在,但不能使用。
1.2静态局部变量始终具有块作用域。(与自动变量作用域相同)
1.3对基本类型的静态局部变量在定义时若为赋初值,则系统自动赋值为0.
1.4举例以下:
void static_local_variable()
{
static int count = 0;
count++;
}
第1次进入此函数,静态变量count被初始化为0(若不初始化,系统会自动初始化为0),接下来履行count++。
而以后调用此函数则只履行count++.
此函数与以下代码实现一样的功能:
int count = 0;
void fuc()
{
count++;
}
2.静态全局变量
2.1静态存储期限。犹如声明为static的局部变量1样,外部变量具有静态存储期限,存储在外部变量中的值奖
被永久的保存下来。
2.2文件作用域。外部变量具有文件作用域;从变量被声明的位置开始,1直到所在文件的末尾。因此,跟随在
外部变量以后声明的所有函数都可以访问。
2.3举例以下:
//xxxx.cpp
void fucOne()
{
sCount++;
count++;
}
static int sCount = 0;
int count = 0;
void fucTwo()
{
sCount++;
count++;
}
a.fucOne()定义在sCount和count变量之前,编译时会提示未声明标示符。而fucTwo()定义在两变量以后,在
fucTwo()中则可正常使用。且在其他.cpp文件中不可访问。
b.若两个.cpp文件声明了同名的全局变量,其本质为生命了两个独立的静态全局变量。
c.count变量则可同享,在xxx.h文件中对其声明 extern int count;在任何1个包括此头文件的.cpp文件中初始化1次便可同享此全局变量。而一样的方法却不适用于静态变量。
(强烈建议:不要将静态/静态变量定义在.h文件中)
3.static函数
3.1内部函数(static函数,不可再其他文件中调用)
如果在1个原文件中定义的函数只能被此源文件使用,则在函数类型前加 static 关键字便可。(利用了
static的文件作用域)
举例以下:
static void fuc()
{
}
3.2外部函数(可在其他文件中调用)
举例以下:
//file.cpp
[extern] void fuc()
{
}
//main.cpp
int main()
{
extern void fuc();
}
4.静态类成员
4.1 类的静态成员可以是private的或public的。静态数据成员可以是常量、指针、援用、类类型等。
4.2 其静态成员属于类而非某个特定对象。其静态成员函数中也不能使用this指针。
4.2 类静态成员的使用
a.定义并初始化
1般来讲,不能在类的内部初始化静态数据成员,相反的,必须在类的外部定义和初始化每一个静态数据成
员。
举例以下:
//xxxx.h
class A
{
private:
static int count;//声明
public:
static void fuc();
}
int A::count = 0;//定义、初始化
(注意:最好将静态数据成员的定义初始化放在对应的.cpp文件中,若像如上定义,在此头文件被屡次包括时,静态成员会被重复定义)
b.类内初始化
如果某个数据成员的利用场景仅限于编译器可以替换它的情况,则1个初始化的const或constexpr static不需要分别定义.
举例以下:
class Account
{
public:
static doule fuc(){};
private:
static constexpr int NUM = 30;
int array[NUM];
}
相反若它将用于值不能替换的场景中,则该成员必须有1条定义语句:
举例以下:
constexpr int Account::NUM;//只定义,不初始化,初始化已在类内提供
(建议:即便1个常量静态数据成员在类内被初始化了,通常情况下也应当在类外定义1下该成员)
c.静态成员的两个利用
(1)静态成员可以是不完全类型(不完全类型:只声明,未定义)
(2)可以用静态成员作为默许实参