首页 > 编程笔记

C++ static静态成员变量(入门必读)

C++提供了多种不同类型的类成员,其中就包括本节要讲的静态成员变量(Static Member Variables),它在某些特定场景下非常有用。

和普通的成员变量相比,静态成员变量的特别之处在于:它只有一份内存实例,不属于某一个类对象,而是被当前类的所有对象共享。

静态成员变量的定义

类中用 static 关键字修饰的成员变量,就叫做静态成员变量。

静态成员变量在类的内部声明,必须在类的外部定义和初始化,定义和初始化的时候要有类名作为前缀。举个简单的例子:
class Student {

private:
    static int count; //在类内部声明静态成员变量
};

// 初始化静态成员变量
int Student::count = 0;
注意,静态成员变量只能被初始化一次,并且它在整个程序执行期间一直存在。

静态成员变量的使用

static 成员变量遵循正常的公有、保护和私有访问限制。对于 public 属性的静态成员变量,可以使用域操作符::直接调用它,当然类对象也可以间接调用它。

假设上面 Student 类中的 count 是 public 属性的,那么在类外部调用它的方法有两种:
int n = Student::count; // ① 直接调用

Student stu;
int n = stu.count // ② 间接调用
推荐大家使用第一种方式。

完整实例

下面的实例使用一个名为 Student 的简单类来演示静态成员变量的使用。这个类包含一个静态成员变量 count,用于跟踪创建的 Student 对象的数量。
#include <iostream>
#include <string>

class Student {
public:
    Student(std::string n) : name(n) {
        ++count;
    }
    ~Student() {
        --count;
    }

private:
    std::string name;

public:
    static int count;
};

// 初始化静态成员变量
int Student::count = 0;

int main() {
    std::cout << "Student::count = " << Student::count << std::endl;

    Student s1("Alice");
    Student s2("Bob");
    std::cout << "Student::count = " << Student::count << std::endl;

    {
        Student s3("Charlie");
        std::cout << "Student::count = " << Student::count << std::endl;
    } // s3 的析构函数在这里调用

    std::cout << "Student::count = " << Student::count << std::endl;
    return 0;
}
运行结果为:

Student::count = 0
Student::count = 2
Student::count = 3
Student::count = 2

示例中,count 静态成员变量是为当前类的所有对象共享的,任何一个对象修改 count,该操作对其它对象仍然有效。

总结

静态成员变量在类内部声明的同时,必须在类外部进行初始化。

C++中的静态成员变量为类提供了一种共享状态和信息的有效机制,在编写单例模式、对象计数或资源管理等方面具有一定的实用价值。

推荐阅读