学习目标:
掌握c++中类的静态成员用法学习内容:
1、 类的静态数据成员
2、 类的静态成员函数
3、 多文件实例
作为一名大学c++初学者,本人在最近一次实验课中学到了关于类的静态成员内容,在一脸懵逼中度过了漫长的实验课。。。
回到宿舍后我痛定思痛,决定攻克这个可恶的知识点,参考了众多视频与书面资料后,感觉学有所成,今天便来同各位大佬展示自己的拙见。
类的静态数据成员
大家可以想一下,如果我们有一个公司类,这时需要统计公司的成员个数,这个个数应该存储在什么地方呢?
如果用类外的数据存储,就不能实现数据的隐藏,而且不符合面向对象编程的思想:如果在类中增加一个数据成员来存放总数,会在创立的每一个对象中创建一个副本,造成冗余,而且每个对象分别维护一个总数,容易造成数据的不一致性。
所以我们可以创建一个所有对象共享的一个数据,这便是静态数据成员。
静态数据成员一般的用法: 类名::标识符
需要注意:其初始化不能通过构造函数,只能在类外进行。
文章最后会给一个综合实例来演示其用法
类的静态函数成员
大家试想,现在需要一个函数来输出公司的人数,最开始假设公司人数初始化为0,此时公司类并没有对象,这时怎样输出这个人数初始值呢??
由于没有对象,无法通过对象.函数()来调用,这时静态成员函数就可以发挥它的作用了。
需要注意: 静态成员函数一般是用来配合静态数据的,没有静态数据也就没必要声明静态函数。
下面是一个多文件的实例;
题目(这是我这次实验课遇上的题目):
实现客户机(CLIENT)类。定义字符型静态数据成员ServerName,保存其服务器名称;整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。在头文件client.h中定义类,在文件client.cpp中实现,在文件test.cpp中测试这个类,观察相应的成员变量取值的变化情况。
以下是代码:
//client.h
#pragma once
#ifndef CLIENT_H
#define CLIENT_H
class CLIENT
{
public:
CLIENT();
~CLIENT();
static void ChangeServerName(char name);//改变服务器名称
static void ShowNum();//输出客户个数
static void ShowServerName();//输出服务器名
private:
static int ClientNum; //客户数量
static char ServerName; //服务器名
};
#endif
//client.cpp
#include"client.h"
#include<iostream>
using namespace std;
int CLIENT::ClientNum = 0; //静态数据成员初始化,类外定义
char CLIENT::ServerName = 'A';//静态数据成员初始化,类外定义
CLIENT::CLIENT() { ClientNum++; }
CLIENT::~CLIENT() { ClientNum--; }
//静态成员函数
void CLIENT::ChangeServerName(char name)
{
//这里需要注意 this->ServerName = name是不行的,原因可能是
//静态成员函数不需要this指针
ServerName = name;
}
void CLIENT::ShowNum()
{
cout << "客户的数量为:" << ClientNum << endl;
}
void CLIENT::ShowServerName()
{
cout << "服务器名为:" << ServerName << endl;
}
//text.cpp
#include<iostream>
#include"client.h"
using namespace std;
int main()
{
CLIENT::ShowNum();//未创建对象,先试试能不能输出客户个数
CLIENT::ShowServerName();//同上
CLIENT A;//创建对象
A.ChangeServerName('A');//修改服务器名
//输出
A.ShowNum();
A.ShowServerName();
//以下同理
CLIENT B;
B.ChangeServerName('B');
B.ShowNum();
B.ShowServerName();
return 0;
}
程序运行截图
以上就是我个人的理解了,如有错误,恳请各位大神指正!