介绍
在 C++ 中,static 意为静态,通常声明在变量或函数前面。
作用
(1)在函数内的局部变量声明前添加 static 关键字,使其变量的生命周期变为全局,直到程序结束时才释放。
(2)在源文件的普通函数和全局变量前添加 static 关键字,使其变为只供当前文件内部使用。
(3)在类中的成员函数和变量前声明 static 关键字,使其可以直接在类外调用,并且定义的类对象调用的静态成员函数或变量都为同一个(全局生命周期)。
用法
在局部变量前声明
代码如下:
// C++ 标准库 ios 头文件,用于 std::cout 将数据打印到屏幕 std 为 C++ 标准库的命名空间
#include <iostream>
void Print()
{
static int value = 0; //value变量声明,只会在第一次调用时执行此句代码进行初始化
std::cout << "value的地址为: " << &value << std::endl; //打印变量 value 的地址
std::cout << "value的值为: " << value++ << std::endl; //打印 value++ 的值,由于是后++,此句代码会打印++前的值,执行完此句代码才会使 value 的值 +1
}
//主函数
int main()
{
//调用两次打印函数,
Print();
Print();
//暂停查看打印的数据,防止程序直接退出。
system("pause");
return 0;
}
输出结果如下:
根据输出结果可以看出声明了 static 的 int 变量 value 的命周期为全局,调用两次的情况下地址相同,并且值是根据前一次的结果 ++ 后打印的。
在全局范围中声明
代码如下:
static.h:
#pragma once
#include <iostream>
extern int value;
static void testPrint();
static.cpp:
#include "static.h"
#include <iostream>
static int value = 0;
static void testPrint(){
std::cout << "testPrint" << std::endl;
}
main.cpp:
#include "static.h"
int main()
{
value = 1;
testPrint();
return 0;
}
编译结果:
根据编译结果得知:在源文件的全局函数和变量前声明 static 关键字,其函数或变量将只能在本文件中使用,其他文件中无法找到。
在类中声明
代码如下:
// C++ 标准库 ios 头文件,用于 std::cout 将数据打印到屏幕 std 为 C++ 标准库的命名空间
#include <iostream>
//类定义
class Static{
public:
static void Print()
{
static int num = 0;
std::cout << num++ << std::endl;
}
static int value;
};
// 初始化类 Static 的静态成员
int Static::value = 0;
//主函数
int main()
{
//类对象声明
Static m_staticA, m_staticB;
//修改静态成员变量 value 的值并打印
Static::value = 3;
std::cout << "m_staticA.value = " << m_staticA.value << std::endl;//3
m_staticA.value = 5;
std::cout << "m_staticB.value = " << m_staticB.value << std::endl;//5
std::cout << "Static::value = " << Static::value << std::endl;//5
//打印静态变量 value 在不同的对象中的地址
std::cout << "&Static::value = " << &Static::value << std::endl;
std::cout << "&m_staticBvalue = " << &m_staticB.value << std::endl;
std::cout << "&m_staticA.value = " << &m_staticA.value << std::endl;
//执行静态成员函数
//Static::Print();//0
m_staticA.Print();//1
m_staticB.Print();//2
//暂停查看打印的数据,防止程序直接退出。
system("pause");
return 0;
}
输出结果如下:
总结
(1)static 关键字使变量或函数的生命周期变为全局。
(2)在源文件的全局变量或全局函数前添加 static 关键字,会使其的作用域限定在本文件内。
(3)在类的成员变量或成员函数前添加 static 关键字,可以直接在类外访问(在public声明下),声明周期也为全局并且此类的所有对象共享它们(只占一份内存)。