c++讲解---什么是静态数据成员

静态数据成员​​属于类本身,而非某个对象​​ —— 所有对象共享同一份数据,像班级的“公共黑板”,谁都能用,但只有一块。

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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值