初识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 Person
{
public:
static int a;
int b;
static void fun()
{
a = 10; //正确。
b = 10; //错误,静态成员函数只能访问静态数据成员,无法区分是哪个对象的b变量。
}
};
静态数据成员:
- 类内声明,类外初始化。
- 编译阶段分配内存,并且直到程序结束才会释放。
- 可以通过类名和作用域解析运算符(::)直接访问,也可以通过类的对象访问。
- 所有对象共享同一份数据。
//类内声明,类外初始化。
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;
}
所有的对象都共享一份数据,修改一个,其他对象也会被修改。
//所有对象共享同一份数据
class Person
{
public:
static int age;
};
int Person::age = 10;
void test()
{
Person p1;
cout << p1.age << endl;
Person p2;
p2.age = 20;
cout << p1.age << endl; //此处p1.age为20
}
int main()
{
test();
return 0;
}
因此静态成员有两种访问方式。
- 通过对象名 + 变量名访问:如p1.age。
- 通过类名 + 变量名访问:如Person:age。