📜  静态 - C++ (1)

📅  最后修改于: 2023-12-03 15:28:52.743000             🧑  作者: Mango

静态 - C++

静态 (static) 是 C++ 中一个简单但又十分重要的修饰符,应用广泛。本文将介绍静态修饰符在 C++ 中的用法、意义以及代码演示。

静态成员变量

在 C++ 类中,可以声明静态成员变量。它们在内存中只有一份拷贝,与类的实例无关。在声明时,需要在变量前加上 static 关键字。静态成员变量可以通过类名直接访问,也可以通过对象访问。

下面是一个例子:

#include <iostream>
using namespace std;

class MyClass {
  public:
    static int static_var;
    int non_static_var;
};

int MyClass::static_var = 0;

int main() {
  MyClass obj1, obj2;

  obj1.static_var = 1;
  obj1.non_static_var = 2;

  obj2.static_var = 3;
  obj2.non_static_var = 4;

  cout << "obj1: static_var = " << obj1.static_var << ", non_static_var = " << obj1.non_static_var << endl;
  cout << "obj2: static_var = " << obj2.static_var << ", non_static_var = " << obj2.non_static_var << endl;

  cout << "MyClass: static_var = " << MyClass::static_var << endl;

  return 0;
}

输出:

obj1: static_var = 3, non_static_var = 2
obj2: static_var = 3, non_static_var = 4
MyClass: static_var = 3

从输出可以看出,这里每次改变静态变量的值,对所有实例都是影响的。

静态成员函数

静态成员函数与静态成员变量的用法类似,也是只有一个拷贝,与类的实例无关。静态成员函数可以通过类名直接调用,不需要对象。

下面是一个例子:

#include <iostream>
using namespace std;

class MyClass {
  public:
    static void static_func() {
        cout << "This is a static function." << endl;
    }

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

int main() {
  MyClass::static_func(); // 调用静态函数

  MyClass obj;
  obj.non_static_func(); // 调用非静态函数

  return 0;
}

输出:

This is a static function.
This is a non-static function.
静态局部变量

在函数内部定义的变量称为局部变量。有时候需要在函数内部定义一个变量,希望它的值在函数调用间保持不变。这时可以使用静态变量,即在变量前加上 static 关键字。

下面是一个例子:

#include <iostream>
using namespace std;

void func() {
  static int static_var = 0;
  int non_static_var = 0;

  static_var++;
  non_static_var++;

  cout << "static_var = " << static_var << ", non_static_var = " << non_static_var << endl;
}

int main() {
  func();
  func();
  func();

  return 0;
}

输出:

static_var = 1, non_static_var = 1
static_var = 2, non_static_var = 1
static_var = 3, non_static_var = 1

从输出可以看出,这里静态变量 static_var 的值在函数调用之间保持不变。

静态 assert 断言

静态 assert 断言是指在编译时检查某种条件是否成立,并在不成立时产生编译错误。这种断言适用于一些简单的条件检查。

静态 assert 断言的语法为:

static_assert(expression, message_opt);

其中 expression 是需要检查的条件,message_opt 是可选的错误信息。

下面是一个例子:

#include <iostream>
#include <type_traits>
using namespace std;

template<typename T>
void func(T t) {
  static_assert(is_integral<T>::value, "Not integral type.");

  cout << t << endl;
}

int main() {
  func(123);
  // func(123.456); // 编译错误:Not integral type.

  return 0;
}

从输出可以看出,这里在调用 func 函数时,如果传入的类型不是整型,就会产生编译错误。

总结

静态关键字在 C++ 中应用广泛,包括静态成员变量、静态成员函数、静态局部变量和静态 assert 断言等等。掌握这些用法,对于 C++ 程序员来说十分重要。