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

简介: 【C++】C++类的静态成员

类的静态成员包括静态的数据成员和静态的成员函数!

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源码下载地址: 点我进行下载


目录
相关文章
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
63 2
|
2月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
113 5
|
2月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
114 4
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
152 4
|
3月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
35 4
|
3月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
34 4
|
3月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
33 1
|
3月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
3月前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
24 0
|
3月前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)