1. static关键字的介绍
C++中有一个关键字static,它的含义有时和普通变量或函数有所不同,这里将介绍C++中static关键字的作用和用法。
2. static关键字与全局变量
2.1 全局变量与静态全局变量的区别
在C++中,全局变量通常会在程序中的各个函数间共享,其作用域为整个文件。而声明为static的全局变量只在声明它的文件的作用域内可见,这意味着在程序的其他文件中无法访问该变量。
下面是一个例子,其中有两个文件file1.cpp和file2.cpp:
// file1.cpp
double global_var = 3.14;
// file2.cpp
#include <iostream>
extern double global_var;
extern double static_var;
void print_vars()
{
std::cout << "global_var = " << global_var << std::endl;
std::cout << "static_var = " << static_var << std::endl;
}
static double static_var = 2.71;
int main()
{
print_vars();
return 0;
}
在上面的代码中,全局变量global_var被定义在file1.cpp中,可以在file2.cpp中通过关键字extern引用。而static_var被定义在file2.cpp中,只在该文件中可见,因此在print_vars()函数中可以访问它,但无法访问global_var。
这种方法有时被用来实现单件模式,即确保某个类声明的对象只存在一个。可以在类的定义中定义一个静态私有成员变量,用于存储该类唯一的对象,同时定义一个静态的公有函数,用于返回这个对象。
2.2 局部静态变量
C++中还可以定义函数内的静态局部变量。这些变量的生命周期延长到整个程序的执行过程中,而不是每次函数调用时重新创建。
下面是一个例子:
#include <iostream>
void func()
{
static int counter = 0;
std::cout << "counter = " << counter << std::endl;
counter++;
}
int main()
{
for(int i=0; i<5; i++)
func();
return 0;
}
在上面的代码中,函数func()中的counter变量会被初始化一次,并且在每次函数调用时保留其值,因此输出结果为0、1、2、3、4。
3. static关键字与类
3.1 静态成员变量
在C++中,可以将成员变量或成员函数声明为静态的,这意味着它们与类相关,而非与类的对象相关。静态成员变量在所有类的对象之间共享,因此它们的生命周期与程序的生命周期相同。而成员函数则只能访问静态成员变量和静态成员函数。
下面是一个例子:
#include <iostream>
class MyClass {
public:
MyClass() { count++; }
static int getCount() { return count; }
private:
static int count;
};
int MyClass::count = 0;
int main()
{
MyClass obj1, obj2, obj3;
std::cout << "Number of objects created: " << MyClass::getCount() << std::endl;
return 0;
}
在上面的代码中,定义了一个MyClass类,其中有一个私有成员count被定义为static,这个变量被初始化为0。每次对象被创建时,count的值会增加1。而getCount()函数是一个静态函数,它返回count的值。在main函数中创建三个对象,并使用静态函数输出了MyClass类创建的对象数量。
3.2 静态成员函数
静态成员函数只能访问静态成员变量和其他静态成员函数,因为它们没有this指针,所以不能访问非静态成员变量或函数。与普通成员函数相比,静态成员函数使用时更类似于全局函数。
下面是一个例子:
#include <iostream>
class MyClass {
public:
static void sayHello() { std::cout << "Hello!" << std::endl; }
};
int main()
{
MyClass::sayHello();
return 0;
}
在上面的代码中,定义了一个MyClass类,其中有一个静态成员函数sayHello(),它只输出一个hello字符串。在main函数中直接通过类名调用了这个函数,而不需要创建任何对象。
4. 总结
C++中的static关键字是一个非常有用的特性,它可以用作全局变量或函数的作用域限制,或者用作类的静态成员变量和函数。使用它可以更好地控制程序的作用域和可见性,并减少全局变量和函数的使用频率。