C++中的static

在C++中,static是一种关键字,它可以应用于不同的元素,例如变量、函数和类成员等,它的含义有所不同。

静态变量

当static用于变量时,它可以将变量声明为静态变量。静态变量有以下特点:

  • 静态变量存储在静态存储区,而不是栈上或堆上。
  • 静态变量在程序运行时只被初始化一次,并一直存在于内存中,直到程序结束。
  • 静态变量默认被初始化为0。

下面是一个使用静态变量的示例:

#include <iostream>

void increment() {
  static int i = 0;
  i++;
  std::cout << i << std::endl;
}

int main() {
  increment();
  increment();
  increment();
  return 0;
}

输出:

1
2
3

静态函数

当static用于函数时,它可以将函数声明为静态函数。静态函数有以下特点:

  • 静态函数只能在声明它的文件中使用,不能被其他文件调用。
  • 静态函数不能访问非静态变量。

下面是一个使用静态函数的示例:

#include <iostream>

static void static_function() {
  std::cout << "This is a static function." << std::endl;
}

void non_static_function() {
  std::cout << "This is a non-static function." << std::endl;
}

int main() {
  static_function();
  non_static_function();
  return 0;
}

输出:

This is a static function.
This is a non-static function.

静态类成员

当static用于类的成员变量和成员函数时,它可以将它们声明为静态成员。静态成员有以下特点:

  • 静态成员是类的所有对象共享的,它们只有一份拷贝。
  • 静态成员可以被类的所有对象访问和修改,也可以通过类名和作用域运算符直接访问和修改。
  • 静态成员可以初始化为常量或表达式。

下面是一个使用静态类成员的示例:

#include <iostream>

class MyClass {
 public:
  static int static_variable;
  static void static_function();
  int non_static_variable;
  void non_static_function();
};

int MyClass::static_variable = 0;

void MyClass::static_function() {
  std::cout << "This is a static function." << std::endl;
}

void MyClass::non_static_function() {
  std::cout << "This is a non-static function." << std::endl;
}

int main() {
  MyClass obj1, obj2;
  obj1.static_variable = 1;
  obj2.static_variable = 2;
  std::cout << obj1.static_variable << std::endl;
  std::cout << obj2.static_variable << std::endl;
  obj1.static_function();
  obj1.non_static_function();
  return 0;
}

输出:

2
2
This is a static function.
This is a non-static function.

单例模式是一种常见的设计模式,它可以确保一个类只有一个实例,并提供访问该实例的全局点。

下面是使用静态方法实现单例模式的示例:

#include <iostream>

class Singleton {
 public:
  static Singleton& getInstance() {
    static Singleton instance;
    return instance;
  }
  void showMessage() {
    std::cout << "Hello, World!" << std::endl;
  }
 private:
  Singleton() {}
  Singleton(const Singleton&);
  Singleton& operator=(const Singleton&);
};

int main() {
  Singleton& instance1 = Singleton::getInstance();
  Singleton& instance2 = Singleton::getInstance();
  instance1.showMessage();
  instance2.showMessage();
  return 0;
}

输出:

Hello, World!
Hello, World!

在上面的示例中,getInstance方法是静态方法,它返回一个Singleton类的引用。在该方法中,我们使用了静态变量instance来保存Singleton类的唯一实例。由于静态变量存储在静态存储区,因此它们只会被初始化一次,并一直存在于内存中,直到程序结束。通过返回instance的引用,我们可以在程序的任何地方访问Singleton类的唯一实例。

请注意,在Singleton类的构造函数、拷贝构造函数和赋值运算符中,我们将它们声明为私有的。这是因为我们不希望用户创建Singleton类的其他实例,从而确保Singleton类只有一个实例。

Xuanwei Zhang
Xuanwei Zhang
Software Engineer

My research interests include distributed database, distributed storage system and internet of things