初识static关键字
一、static的作用
在C++中,static关键字是一个多功能的修饰符,它可以用于不同的上下文,并且具有不同的意义。
二、局部静态变量
在函数内部,如果你使用static关键字声明一个变量,那么这个变量只会初始化一次,并且它的生命周期会持续到程序结束
。
这意味着,即使在函数返回之后,这个变量的值也会被保留下来,并且在下次函数调用时仍然有效。
void func()
{
static int count = 0; // 只在第一次调用时初始化
count++;
std::cout << "Count: " << count << std::endl;
}
三、全局/命名空间静态变量
在文件的全局作用域或命名空间中,static关键字用于限制变量的可见性。一个静态全局变量或命名空间变量只在本文件中可见
,不能被其他文件直接访问。这通常用于隐藏特定于文件的变量,或者为库提供内部状态。
// File1.cpp
static int secret_value = 42; // 其他文件不能直接访问这个变量
// File2.cpp
// 这里不能直接访问secret_value,因为它是File1.cpp中的静态全局变量
四、静态成员函数和静态数据成员
静态成员函数:
- 在类定义中,静态成员函数不与类的任何特定实例关联。
- 它们
可以直接通过类名来调用,不需要创建类的实例
。 - 静态成员函数只能访问
静态成员变量
和其他静态成员函数
。 - 没有this指针,因为它们是独立于类的任何特定对象的。
- 只需在
声明处出现
一次static关键字,在类外定义的时候不需要
重复。
class Test
{
static void fun();
};
void Test::fun()
{
cout << 10 << endl;
}
静态数据成员:
- 静态数据成员必须在类
外部定义和初始化
。 - 只在
程序开始
时分配
一次空间
,并且直到程序结束才会释放。 - 可以通过类名和作用域解析运算符(::)直接访问,也可以通过类的对象访问。
class MyClass
{
public:
static int staticVar; // 静态成员变量
static void staticFunc()
{
//访问静态成员变量
std::cout << "Static variable: " << staticVar << std::endl;
}
void print()
{
//类的成员函数不需要::(作用域运算符)也可以直接访问
std::cout << staticVar << endl;
}
};
int MyClass::staticVar = 0; // 静态成员变量需要在类外部定义
int main()
{
MyClass::staticFunc(); // 直接通过类名调用静态成员函数
return 0;
}
类中的静态成员存在于任何对象之外,对象不包含任何与静态数据成员有关的数据。下面这个例子如果进行实例化对象,那么该对象中数据成员只有 int a,成员函数只有fun() 函数。
class Test
{
private:
int a;
//static int b;
public:
static void print(){}
static void add() {}
void fun() {}
static int b;
};
int Test::b = 10;
int main()
{ Test a;
cout << a.b << endl; //当b在public修饰时,正确
cout << Test::b << endl; //同上
//cout << a.b << endl; //b在private修饰时,错误
//cout << Test::b << endl; //同上
return 0;
}
如果静态数据成员被声明为类的私有成员,那么它们就不能从类的外部直接访问,无论是否通过对象还是类名。这是因为私有成员的访问被限制在类本身以及它的友元函数和友元类中。