静态数据成员属于类本身,而非某个对象 —— 所有对象共享同一份数据,像班级的“公共黑板”,谁都能用,但只有一块。
1.标识符类 IdNo
在这里,我们为了明白静态数据成员的特点,去写一个类,这个类能够实现对生成对象拥有标识符的功能。
| 类名 | IdNo |
| 功能 | 在每次创建该类类型的对象时,使用连续整数值 1, 2, 3,…赋予各对象标识号。 |
| 数据成员 | 类型为 int 型、名称为 id_no |
| 静态数据成员 | 添加 static 声明,类型为 int 型、名称为 count |
类的代码为:
// 标识号类 IdNo(第1版:头文件)
#ifndef __Class_IdNo
#define __Class_IdNo
class IdNo {
private:
static int counter; // 静态成员:记录已分配的标识号数量(类级别共享)
int id_no; // 普通成员:每个对象的唯一标识号
public:
IdNo(); // 构造函数:自动分配新标识号
int id() const; // 成员函数:返回当前对象的标识号(const保证不修改对象)
};
#endif
// 标识号类 IdNo(第1版:源文件)
#include "IdNo.h"
// 静态成员初始化(必须在类外定义,分配内存空间)
int IdNo::counter = 0; // 初始化为0,程序启动时执行
// 构造函数实现
IdNo::IdNo()
{
id_no = ++counter; // 先递增counter,再赋值给id_no
// 保证第一个对象的id_no为1
}
// 获取标识号实现
int IdNo::id() const
{
return id_no; // 返回当前对象的唯一标识号
}
// IdNoTest.cpp - 标识号类测试程序
#include <iostream>
#include "IdNo.h"
using namespace std;
int main()
{
IdNo a; // 创建后运行结果:a的标识号:1
IdNo b; // 创建后运行结果:b的标识号:2
IdNo c[4]; // 创建数组后运行结果:
// c[0]的标识号:3
// c[1]的标识号:4
// c[2]的标识号:5
// c[3]的标识号:6
cout << "a的标识号:" << a.id() << '\n'; // 输出:1
cout << "b的标识号:" << b.id() << '\n'; // 输出:2
for (int i = 0; i < 4; i++)
cout << "c[" << i << "]的标识号:" << c[i].id() << '\n';
// 循环输出:
// c[0]的标识号:3
// c[1]的标识号:4
// c[2]的标识号:5
// c[3]的标识号:6
}
当创建对象a与对象b时,其数据成员的归属如下图所示:

2.共有变量标识符类VerID
创建类 VerID,把该数据成员修改为公有成员,由此来验证静态数据成员的访问问题。静态成员设为公有后,可以直接通过类名访问(如 VerId::counter),从而直观验证其共享性和类级作用域。
// 用于验证的标识号类 VerId(头文件)
#ifndef ___Class_VerId
#define ___Class_VerId
class VerId {
int id_no; // 私有:每个对象的唯一标识号
public:
static int counter; // 公有静态成员:已分配的标识号总数
VerId(); // 构造函数
int id() const; // 返回当前对象的标识号
};
#endif
// 用于验证的标识号类 VerId(源文件)
#include "VerId.h"
int VerId::counter = 0; // 静态成员初始化(必须类外定义)
// 构造函数:自动分配新标识号
VerId::VerId()
{
id_no = ++counter; // 先递增计数器,再赋值给当前对象
}
// 返回当前对象的标识号
int VerId::id() const
{
return id_no;
}
// 验证标识号类的使用例程
#include <iostream>
#include "VerId.h"
using namespace std;
int main()
{
VerId a; // 创建第1个对象 → id_no=1, counter=1
VerId b; // 创建第2个对象 → id_no=2, counter=2
cout << "a的标识号:" << a.id() << '\n'; // 输出:1
cout << "b的标识号:" << b.id() << '\n'; // 输出:2
cout << "创建的对象的个数:" << VerId::counter << '\n'; // 输出:2
cout << "创建的对象的个数:" << a.counter << '\n'; // 输出:2
cout << "创建的对象的个数:" << b.counter << '\n'; // 输出:2
}

398

被折叠的 条评论
为什么被折叠?



