static关键字
static关键字主要应用于以下几种情况:
情况1:static静态函数
定义静态函数:在函数返回类型前加上static关键字,函数即被定义为静态函数。静态函数只能在本源文件中使用。
如:我们定义一个自己的加法器函数在mySum.cpp中,然后在主函数中调用。
#include <iostream>
#include "mySum.h"
using namespace std;
int main() {
int mySum(int a, int b);
cout << mySum(10, 20);
}
#include <iostream>
int mySum(int a, int b);
#include <iostream>
using namespace std;
int mySum(int a, int b) {
return a + b;
}
运行结果如下:
可以看出,在main函数中成功调用了其他源文件中的函数。
但是,我们把加法器函数改为静态函数之后,运行之后发现报错。
#include <iostream>
#include "mySum.h"
using namespace std;
int main() {
int mySum(int a, int b);
cout << mySum(10, 20);
}
#include <iostream>
static int mySum(int a, int b);
#include <iostream>
using namespace std;
static int mySum(int a, int b) {
return a + b;
}
运行结果如下:
这是因为静态函数只能在本源文件中使用。
情况2:static全局变量
在全局变量前面加上satic关键字便成为静态全局变量,初始化的静态全局变量会在数据段分配内存,未初始化的静态全局变量会在BSS段分配内存。静态全局变量的作用域仅限于本源文件。
如:我们在头文件static_val.h中定义变量a,然后在main.cpp中打印它
#include <iostream>
int a = 10;
#include <iostream>
#include "static_val.h"
using namespace std;
int main() {
cout << a;
}
运行结果为:
不同的源文件中都可以使用同一个全局变量。
然而我们将其定义为静态全局变量之后,在main.cpp中便不能访问a,因为静态全局变量的作用域只存在于当前源文件。
情况3:静态局部变量
静态局部变量有以下几个特点:
- 初始化的静态局部变量分配在数据区,未初始化的分配在BSS区。生命周期一直保持到程序结束。
- 作用域只限于当前局部区域。
- 首次初始化时赋值生效,以后的初始化赋值自动跳过。
#include <iostream>
using namespace std;
void func() {
static int a = 0;
int b = 1;
cout << a << " " << b << endl;
++a;
++b;
}
int main() {
func();
func();
func();
}
打印结果为:
可以看出静态局部变量a的值每次都在增加,因为它一直存放在数据区,生命周期随着程序的结束而结束。而普通局部变量的值一直保持不变,因为局部变量存放在栈区,超出作用范围后就被系统回收。
如果我们想在main函数中访问a变量则会报错:
#include <iostream>
using namespace std;
void func() {
static int a = 0;
int b = 1;
cout << a << " " << b << endl;
++a;
++b;
}
int main() {
func();
func();
func();
cout << a;
}
运行结果如下:
这是因为虽然静态局部变量生命周期随着程序结束才结束,但是它的作用范围在局部区域,main函数中显然不能访问到。
情况4:静态成员变量。
静态成员变量有如下特点:
- 类似于静态局部变量,它既可以被当成全局变量那样去存储,但又被隐藏在类的内部。
- 类中的static静态数据成员拥有一块单独的存储单元,而不管创建了多少个该类的对象。所有这些对象的静态数据成员都共享这一块静态存储空间。
如:类A中存在静态成员变量a。创建几个类A的实例,在其中一个实例中改变a的值,检测其他实例中a的值。
#include <iostream>
using namespace std;
class A {
public:
static int s;
};
int A::s = 10;
int main() {
A b, c;
b.s = 20;
cout << c.s << endl;
cout << A::s << endl;
}
运行结果如下:
可以看出改变了创建了两个A的实例b和c,改变了b中的s的值之后,在打印c中s的值也是改变后的值。这是因为所有类的对象都共用一个static成员变量,它定义在数据区中,因此我们也可以直接根据作用域访问它。
情况5:静态成员函数
与静态成员变量不同,静态成员函数的作用不是为了对象之间的沟通,而是为了处理静态成员变量。
静态成员函数有如下几个特点:
在A中定义一个静态成员变量s和非静态成员变量a,测试静态成员函数print打a和s
#include <iostream>
using namespace std;
class A {
public:
static void print() {
cout << s;
}
private:
int a = 10;
static int s;
};
int A::s = 10;
int main() {
A b;
b.print();
}
运行结果如下:
在静态成员函数中打印非静态成员变量a通不过编译:不能访问非静态成员对象。可以成功打印静态成员变量a。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)