C++ 类的静态成员
类的静态成员
我们可以使用 static 关键字将类成员定义为静态成员。当我们将类的成员声明为静态成员时,这意味着无论创建多少个类对象,该静态成员都只有一个副本。
静态成员由类的所有对象共享。如果没有其他初始化,则在创建第一个对象时,所有静态数据都会初始化为零。我们不能将其放在类定义中,但可以在类外部初始化它,如下例所示,通过重新声明静态变量,并使用作用域解析运算符 :: 来标识它属于哪个类。
示例
让我们尝试以下示例来理解静态数据成员的概念 -
#include <iostream> using namespace std; class Box { public: static int objectCount; // 构造函数定义 Box(double l = 2.0, double b = 2.0, double h = 2.0) { cout <<"Constructor called." << endl; length = l; breadth = b; height = h; // 每次创建对象时增加 objectCount++; } double Volume() { return length * breadth * height; } private: double length; // box 盒子的长度 double breadth; // box 盒子的宽度 double height; // box 盒子的高度 }; // 初始化 Box 类的静态成员 int Box::objectCount = 0; int main(void) { Box Box1(3.3, 1.2, 1.5); // 声明 box1 Box Box2(8.5, 6.0, 2.0); // 声明 box2 // 打印对象总数。 cout << "Total objects: " << Box::objectCount << endl; return 0; }
当编译并执行上述代码时,它会产生以下结果 -
Constructor called. Constructor called. Total objects: 2
静态函数成员
通过将函数成员声明为静态,可以使其独立于类的任何特定对象。即使不存在类的对象,也可以调用静态成员函数,并且只能使用类名和作用域解析运算符::访问静态函数。
静态成员函数只能访问静态数据成员、其他静态成员函数以及类外部的任何其他函数。
静态成员函数具有类作用域,并且它们无法访问类的this指针。您可以使用静态成员函数来确定类的某些对象是否已创建。
示例
让我们尝试以下示例来理解静态函数成员的概念 -
#include <iostream> using namespace std; class Box { public: static int objectCount; // 构造函数定义 Box(double l = 2.0, double b = 2.0, double h = 2.0) { cout <<"Constructor called." << endl; length = l; breadth = b; height = h; // 每次创建对象时增加 objectCount++; } double Volume() { return length * breadth * height; } static int getCount() { return objectCount; } private: double length; // box 盒子的长度 double breadth; // box 盒子的宽度 double height; // box 盒子的高度 }; // 初始化 Box 类的静态成员 int Box::objectCount = 0; int main(void) { // 创建对象前打印对象总数。 cout << "Inital Stage Count: " << Box::getCount() << endl; Box Box1(3.3, 1.2, 1.5); // 声明 box1 Box Box2(8.5, 6.0, 2.0); // 声明 box2 // 创建对象后打印对象总数。 cout << "Final Stage Count: " << Box::getCount() << endl; return 0; }
当编译并执行上述代码时,它会产生以下结果 -
Inital Stage Count: 0 Constructor called. Constructor called. Final Stage Count: 2
静态成员的用例
以下是一些用例:
- 单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点。静态成员非常适合实现这种模式,因为它们允许维护类的单个共享实例。
- 静态成员通常用于管理应在类的所有实例之间共享的共享资源或计数器。
- 静态成员可用于存储全局配置设置或常量,这对于管理资源池(例如,缓存、数据库连接池等)以及实现跨实例共享的日志系统非常有用。该日志系统在类的所有实例之间共享。
- 静态成员可用于跟踪方法调用。