c++中static关键字的作用是什么?

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关键字是一个非常有用的特性,它可以用作全局变量或函数的作用域限制,或者用作类的静态成员变量和函数。使用它可以更好地控制程序的作用域和可见性,并减少全局变量和函数的使用频率。

后端开发标签