c++之静态函数和静态方法

2023-10-26

 1 对象与对象之间要共享数据,则需要使用静态成员或静态方法。

 2 在类中声明静态成员变量,即使不实例化对象,也可以我静态成员变量分配空间。(因为静态成员变量在对象创建之前就已经被分配了内存空间)

 3  静态成员虽在类中,但它并不是随对象的建立而分配内存空间的,也不是随对象的撤销而释放(一般的成员在对象建立时会分配空间,在对象撤销时会释放)。静态成员变量是在程序编译时分配空间,而在程序结束时释放空间。

 4 初始化静态成员变量要在类的外面进行。int player::playerNumber = 0; 初始化的格式如下:

                                                                     数据类型名 类名::静态成员变量名=初值;

 5 可以通过类名对静态成员变量进行引用,也可以通过对象名对静态成员变量进行引用。


 6 不能用参数初始化表对静态成员变量进行初始化。


  代码示例:以下代码是两个小人相互攻击的示例


#include<iostream>
#include<string>
using namespace std;
class player {
	string playerName;  //玩家姓名
	int attack; //攻击力
	int defense;  //防御力
	int health = 100;  //生命值 
	int maxHealth = 100; //最大生命值
public:
	static int playerNumber;
	//构造函数 总数+1
	player(int attackParam, int defenseParam, string nameParam) {
		attack = attackParam;
		defense = defenseParam;
		playerName = nameParam;
		++playerNumber;
	}
	//析构 总数减1
	~player() {
		--playerNumber;
	}
	//获取攻击力
	int getAttack() {
		return attack;
	}
	//设置攻击力
	void setAttack(int attackParam) {
		attack = attackParam;
	}
	//获取防御力
	int getDefense() {
		return defense;
	}
	//设置防御力
	void setDefense(int defenseParam) {
		defense = defenseParam;
	}
	//改变生命值
	void changeHealth(int healthParam) {
		health += healthParam;
		if (health > maxHealth)
		{
			health = maxHealth;
		}
		else if (health <= 0)
		{
			health = 0;
			cout << "Player " << playerName << "  is Dead ! " << endl;
			delete this;
		}
	}
	//显示属性
	void displayProperty() {
		cout << "名字:" << playerName << endl;
		cout << "攻击力:" << attack << endl;
		cout << "防御力:" << defense << endl;
		cout << "生命值:" << health << endl;
	}
	void attackPlayer(player*  otherPlayer) {
		otherPlayer->changeHealth(-this->attack);
	}
	static int displayNumber() {
		cout << playerNumber << endl;
		return playerNumber;
	}
};
int player::playerNumber = 0;

int main() {
	player* player01 = new player(50, 50, "GSL");
	player* player02 = new player(70, 60, "LJL");
	player01->displayProperty();
	player02->displayProperty();

	if (player01)
	{
		player01->attackPlayer(player02);
	}
	if (player02)
	{
		player02->attackPlayer(player01);
	}
	cout << player::playerNumber << endl;
	if (player01)
	{
		player01->attackPlayer(player02);
	}
	if (player02)
	{
		player02->attackPlayer(player01);
	}
	cout << player::playerNumber << endl;

	system("pause");
	return 9696969;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++之静态函数和静态方法 的相关文章

  • C# AES Rijndael - 检测无效密码

    我正在使用 Rijndael 加密程序中的一些敏感数据 当用户输入错误的密码时 大多数情况下CryptographicException抛出消息 填充无效且无法删除 然而 CryptStream 不会抛出密码错误的异常 而是返回错误解密的流
  • HttpResponseMessage 的内容为 JSON

    我有一个 ASP NET MVC WEB API 由于多种原因 由于没有授权而重定向 我不能只使用一个简单的对象并在我的控制器方法中返回它 因此我需要 HttpResponseMessage 类来允许我重定向 目前我正在这样做 var re
  • 将内核链接到 PTX 函数

    我可以使用 PTX 文件中包含的 PTX 函数作为外部设备函数 将其链接到另一个应调用该函数的 cu 文件吗 这是另一个问题CUDA 将内核链接在一起 https stackoverflow com questions 20636800 c
  • 优化对绑定到 DataGridView 的 DataTable 的更新

    我的应用程序中有一个显示一些数据的表单 当我第一次显示表单时 我将一些数据加载到 DataTable 中 然后将 DataTable 绑定到 DataGridView 我还启动了一个异步方法来执行一些较慢的数据库查询 当这些慢查询完成时 我
  • 如何获取任意类型的默认值

    在 C 中我可以写这样的东西 class AnyThing
  • .NET 中 IEqualityComparer 中 GetHashCode 的作用是什么?

    我试图了解 IEqualityComparer 接口的 GetHashCode 方法的作用 下面的例子取自MSDN using System using System Collections Generic class Example st
  • 让 GCC/Clang 使用 CMOV

    我有一个简单的标记值联合 这些值可以是int64 ts or doubles 我正在对这些联合进行加法 但需要注意的是 如果两个参数都代表int64 t值 那么结果也应该有一个int64 t value 这是代码 include
  • 适用于 Windows 的键值数据库?

    除了 MongoDB 和 Memcached 之外 Windows 上还运行哪些键值存储 我见过的大多数似乎只能在 Linux 上运行 Hypertable Redis Lightcloud 相关链接 是否有经过商业验证的云存储 Key g
  • 复杂的 C 声明

    我刚刚在互联网上浏览了一些代码 发现了这个 float foo SIZE SIZE 我如何阅读这份声明 是否有一套特定的规则来阅读如此复杂的声明 我有一段时间没做这个了 从 开始foo然后向右走 float foo SIZE SIZE fo
  • C# Linq 可以做组合数学吗?

    我有这个数据结构 class Product public string Name get set public int Count get set var list new List
  • 一些涉及类析构函数和删除运算符的内存管理问题?

    在阅读了一些教程后 我仍然不清楚 C 中内存管理的一些观点 1 当使用 new 运算符声明的类超出范围时 是否会调用其析构函数并释放内存 是否有必要调用删除运算符来释放类的内存并调用其析构函数 class Test void newTest
  • DLL 中的 XP 风格组合框

    我需要使用 C 和 WIN32 API 无 MFC 在 DLL 中创建 XP 风格的组合框 我设法在 DLL 中创建控件 不是以 XP 风格 我设法在带有清单的 exe 中创建 XP 样式组合框 但它在 DLL 中不起作用 为了让您的 DL
  • 如何从句柄确定进程是 32 位还是 64 位?

    如何从使用 OpenProcess 获取的进程句柄中获取信息 无论进程是 32 位还是 64 位 是的 IsWow64Process 毫无用处 令人烦恼 它的真正意思是 启用了 32 位模拟 如果您在 32 位操作系统上运行 则返回 fal
  • 在发送传出请求之前将新的 SoapClient 绑定到特定 IP 地址

    假设应用程序所在的计算机具有 SoapClient 具体来说 我正在使用 Microsoft Web Service3 Messaging SoapClient 它通过发送传出请求并获取 SoapEnvelope 作为回报 完善的流程 与远
  • 派生类的聚合初始化

    以下代码无法使用 Visual Studio2017 或在线 GDB 进行编译 我期望它能够编译 因为迭代器只是一个具有类型的类 并且它是从公共继承的 这是不允许的还是在 VS2017 中不起作用 template
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • RabbitMQ + Windows + LDAP 无需发送密码

    我正在尝试在 Windows 7 上使用 RabbitMQ 3 6 2 进行 LDAP 身份验证 授权 我已经在应用程序发送用户名 密码的情况下进行了基本身份验证 但密码位于我需要弄清楚如何进行的代码中避免 有没有人在不提供密码的情况下成功
  • Azure Function App Azure 服务总线触发器触发两次

    我使用带有服务总线触发器的 Azure Function Apps 来读取服务总线并对服务总线消息的内容执行操作 服务总线接收 JSON 序列化对象 然后将 JSON 消息反序列化回 Function App 中的对象 然而 由于某种原因
  • 字符串常量之前应有非限定 ID

    我目前正在编写一个 C 应用程序 它与 math h 结合实现了振荡器 我拥有的代码应该可以很好地用于该应用程序 尝试编译目标文件 但是我遇到编译器错误 很可能与语法 等有关 我认为这与命名空间有关 错误 终端输出 User Name Ma
  • Selenium WebDriver 在按钮单击事件上无法正常工作。这里有什么问题呢?

    I am using following code to scrape data from a website I have following interface 这是 HTML div class es content div

随机推荐