【C++】C++类的静态成员

简介: 类的静态成员包括静态的数据成员和静态的成员函数! static关键字静态数据成员比如我们现在要设计一款战争游戏,在这款游戏中,分为多个兵种,每个兵种都有一定数量的士兵,游戏过程中,每隔一定时间每个兵种都会产生一定数量的士兵,由于战争的消耗,每个兵种的士兵都会减少。

类的静态成员包括静态的数据成员和静态的成员函数!
static关键字

静态数据成员

比如我们现在要设计一款战争游戏,在这款游戏中,分为多个兵种,每个兵种都有一定数量的士兵,游戏过程中,每隔一定时间每个兵种都会产生一定数量的士兵,由于战争的消耗,每个兵种的士兵都会减少。
为了使情节更逼真,引入了士气这个概念,当士气比较高的时候,这个兵种的战斗力就比较强,士气低的时候,这个兵种的战斗力就比较弱。
士兵的士气受很多因素影响,其中一个最直接的因素就是和这个兵种的数量直接相关,当这个兵种的士兵比较多,这个兵种的士气就比较高,战斗力就比较强。如果说当前的兵种士兵比较少,那么士气就比较弱,战斗力也比较弱。

为了实现这种情况,那么我们就记录当前士兵的数量这个变量。
一种比较简单的方法就是,我们可以维护一组全局的变量,每个全局变量都会记录某个兵种当前的数量。
但是使用全局变量会引入比较多的问题,不推荐使用!
1.使用全局变量的时候,安全性无法得到保证。因为我们在程序的各个地方都可以修改全局变量的值。

2.全局变量也会导致命名空间的污染,如果我们的程序比较大,如果定义了多个全局变量,那么各个模块就可能会冲突!

另一种方法就是使用静态数据成员,因为静态数据成员是各个对象所共有的,不属于某个具体的对象。

静态数据成员为各个对象共有,不属于某个具体的对象,所有对象都可以对它进行引用,都可以读取和修改。若一个对象修改了该静态成员的值,则在其他各个对象中该数据成员的值都会同时改变。

定义静态数据成员 以static关键字开头。

static int m_nNum;

定义之后不要忘记在cpp中初始化这个静态成员变量。(初始化的时候不要加static关键字哦)
否则在编译时就会报错:

错误  1   error LNK2001: 无法解析的外部符号 "private: static int CTime::m_nNum" (?m_nNum@CTime@@0HA)   E:\chenhaoxiang\20170603\test2\test2\Time.obj   test2

静态的数据成员是属于这个类的,而不是对象!
定义类时就为静态数据成员分配空间,不随对象的建立而分配空间。
static的成员变量不能在类内进行初始化!
定义完类之后就可以直接引用/访问,
引用方法:
1.类名::静态成员
2.对象名.静态成员
在类内的静态数据成员仅仅是对该成员的声明,同时还需要在类外部进行定义。

静态成员函数

在声明成员函数时在函数前添加static关键字就定义了静态成员函数。

static int getNum();
int CTime::getNum(){
    return m_nNum;
}

与静态数据成员一样,静态成员函数也是类的一部分。两种引用的方法。

CTime::getNum();
time.getNum();

静态成员函数一般是为了处理静态的数据成员。
与一般成员函数的区别:非静态成员函数有this指针,静态成员函数没有this指针。
因为它可以在未定义类对象时就可以引用。因此静态成员函数不能访问本类中的非静态成员。(包括成员函数和数据成员)。

比如在前面定义的getNum()静态函数中,是无法调用其他的非静态方法和变量的!
因为getNum()是依赖于具体的类,而其他非静态成员是依赖于具体对象的!
getNum()不依赖于任何对象!

类中定义的静态数据成员可以代替全局变量,而且没有全局变量的缺点,作用域仅限于当前类的作用域,防止了在其他类修改成员!

源代码下载地址:

GITHUB源码下载地址: 点我进行下载

本文章由[谙忆]编写, 所有权利保留。
欢迎转载,分享是进步的源泉。

转载请注明出处:http://chenhaoxiang.cn

本文源自人生之旅_谙忆的博客

目录
相关文章
|
7天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
17 0
|
3天前
|
C++ Linux
|
6天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1
|
6天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
15 0
|
6天前
|
存储 安全 测试技术
【C++】string学习 — 手搓string类项目
C++ 的 string 类是 C++ 标准库中提供的一个用于处理字符串的类。它在 C++ 的历史中扮演了重要的角色,为字符串处理提供了更加方便、高效的方法。
16 0
【C++】string学习 — 手搓string类项目
|
6天前
|
Java C++ Python
【C++从练气到飞升】06---重识类和对象(二)
【C++从练气到飞升】06---重识类和对象(二)
|
6天前
|
编译器 C++
【C++从练气到飞升】06---重识类和对象(一)
【C++从练气到飞升】06---重识类和对象(一)
|
6天前
|
存储 编译器 C语言
【C++从练气到飞升】02---初识类与对象
【C++从练气到飞升】02---初识类与对象
|
7天前
|
设计模式 算法 编译器
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
11 0