C++ static静态成员变量(入门必读)
C++提供了多种不同类型的类成员,其中就包括本节要讲的静态成员变量(Static Member Variables),它在某些特定场景下非常有用。
和普通的成员变量相比,静态成员变量的特别之处在于:它只有一份内存实例,不属于某一个类对象,而是被当前类的所有对象共享。
静态成员变量在类的内部声明,必须在类的外部定义和初始化,定义和初始化的时候要有类名作为前缀。举个简单的例子:
假设上面 Student 类中的 count 是 public 属性的,那么在类外部调用它的方法有两种:
C++中的静态成员变量为类提供了一种共享状态和信息的有效机制,在编写单例模式、对象计数或资源管理等方面具有一定的实用价值。
和普通的成员变量相比,静态成员变量的特别之处在于:它只有一份内存实例,不属于某一个类对象,而是被当前类的所有对象共享。
静态成员变量的定义
类中用 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
总结
静态成员变量在类内部声明的同时,必须在类外部进行初始化。C++中的静态成员变量为类提供了一种共享状态和信息的有效机制,在编写单例模式、对象计数或资源管理等方面具有一定的实用价值。