首页 > 编程语言 >【自用22.】C++类的静态数据成员以及静态成员函数

【自用22.】C++类的静态数据成员以及静态成员函数

时间:2024-09-11 20:54:25浏览次数:11  
标签:静态数据 函数 22 int 成员 Human include age

需要获取总的人数,如何实现?

方案一:

使用全局变量,在构造函数中对这个全局变量进行修改

具体代码如下:

在Human.cpp中定义全局变量,并在构造函数中对人数进行增加操作

#include "Human.h"
#include <iostream>

using namespace std;

int HumanCount = 0;

Human::Human() {
	name = "无名氏";
	age = 18;
	salary = 30000;
	HumanCount++;
}

Human::Human(int age, int salary) {
	cout << "调用自定义的构造函数" << endl;
	this->age = age;      //this是一个特殊的指针,指向这个对象本身
	this->salary = salary;
	name = "无名";

	addr = new char[64];
	strcpy_s(addr, 64, "China");
	HumanCount++;
}

int Human::getAge() {
	return age;
}

Human* Human::compare1(Human* other) {
	if (age > other->age) {
		return  this; //没有创建新的对象
	}
	else {
		return other;
	}
}

 在Human.h文件中使用extern表示全局变量在其他文件中定义

#pragma once

#include <string>

using namespace std;

extern int HumanCount;

class Human {
public:
	Human();
	Human(int age, int salary);

	int getAge();
	Human* compare1(Human* other);

private:
	string name = "Unknown";
	int age = 28;
	int salary;
	char* addr;
};

在main.cpp文件中调用测试

#include <iostream>
#include <Windows.h>

#include <string.h>
#include "Human.h"

using namespace std;

void test0() {
	Human temp1;
	Human temp2;
}

int main(void) {
	Human h1(25, 30000);
	Human h2(18, 8000);

	Human* p;
	p = &h1;

	cout << p->compare1(&h2)->getAge() << endl;

	test0();

	cout << HumanCount << endl;

	system("pause");
	return 0;
}

结果如下

方案二-类的静态数据成员:

 类内静态变量

首先要在Human.h头文件中定义一个静态变量,代码如下:

#pragma once

#include <string>

using namespace std;

extern int HumanCount;

class Human {
public:
	Human();
	Human(int age, int salary);

	int getAge();
	Human* compare1(Human* other);

private:
	string name = "Unknown";
	int age = 28;
	int salary;
	char* addr;
	
	static int humanCount;
};

然后在Human.cpp文件中对这个静态变量进行初始化,初始化的代码如下:

int Human::humanCount = 0;

这里需要注意的是,在类内声明时,需要写static,但是在初始化的时候是不需要写static的。

之后的处理方式与方案一类似,也是在类的成员函数中进行++操作。

然后为了访问到这个静态变量,我们需要定义一个成员函数来进行访问,成员函数的声明如下:

int gethumanCount();

此声明放在Human.h文件的类定义的public部分中

然后在Human.cpp文件中对这个成员函数进行实现,代码如下

int Human::gethumanCount() {
	return humanCount;
}

然后我们在main函数中任意调用一个对象的humanCount数目即可,具体代码如下:

#include <iostream>
#include <Windows.h>

#include <string.h>
#include "Human.h"

using namespace std;

void test0() {
	Human temp1;
	Human temp2;
}

int main(void) {
	Human h1(25, 30000);
	Human h2(18, 8000);

	Human* p;
	p = &h1;

	cout << p->compare1(&h2)->getAge() << endl;

	test0();

	cout <<"HumanCount" << HumanCount << endl;
	cout << "humanCount" << h1.gethumanCount() << endl;

	system("pause");
	return 0;
}

使用结果如下

类的普通成员函数,可以直接访问静态成员(可读可写) 

 但是方案二有一个问题:如果在一个函数中并不需要创建对象,但是需要使用到静态成员变量,则无法在没有对象的情况之下直接调用静态成员变量。

那这个问题需要如何解决呢?

就是接下来要讲到的

类的静态成员函数

要解决上面的问题,我们只需要在刚刚定义的成员函数前面加上static的修饰,如下:

static int gethumanCount();

 这样我们就可以直接使用类名来调用这个成员函数,因为被static修饰的成员函数不属于任何一个对象,而是直接属于这个类。当然也可以通过对象来调用这个成员函数。具体代码如下:

#include <iostream>
#include <Windows.h>

#include <string.h>
#include "Human.h"

using namespace std;

void test0() {
	Human temp1;
	Human temp2;
}

int main(void) {
	Human h1(25, 30000);
	Human h2(18, 8000);

	Human* p;
	p = &h1;

	//cout << p->compare1(&h2)->getAge() << endl;

	test0();

	cout <<"HumanCount" << HumanCount << endl;
	cout << "humanCount" << h1.gethumanCount() << endl;
	cout << "humanCount" << Human::gethumanCount() << endl;

	system("pause");
	return 0;
}

使用后结果如下:

 总结

1. 静态数据成员

对象的成员函数(没有static的成员函数)内部,可以直接访问“静态数据成员”

类的静态成员函数(有static的成员函数)内部,可以直接访问“静态数据成员”

即:所有的成员函数,都可以访问静态数据成员。

类不能直接访问普通的静态数据成员(Human::humanCount 非法)

2. 静态成员函数

对象可以直接访问静态成员函数

类可以直接访问静态成员函数(Human::getHumanCount())

在类的静态成员函数(类的静态方法)内部,不能直接访问this指针和对象的数据成员!

在类的静态成员函数(类的静态方法)内部,只能访问类的数据成员

 

标签:静态数据,函数,22,int,成员,Human,include,age
From: https://blog.csdn.net/m0_57667919/article/details/142068697

相关文章

  • 22年国内最牛的Java面试八股文合集,不接受反驳
    又是一年金三银四面试季!纵观今年的技术招聘市场, Java依旧是当仁不让的霸主 !即便遭受Go等新兴语言不断冲击,依旧岿然不动。究其原因:Java有着极其成熟的生态,这个不用我多说;Java在运维、可观测性、可监控性方面都有着非常优秀的表现;Java也在积极应对容器化、云原生......
  • PDshell16反向pgsql中 Unable to list the columns. SQLSTATE = 22003不良的类型值 sh
    问题原因:pdshell逆向pg的sql脚本滞后,与pg新版本不兼容,解决方案:修改掉不兼容的sql代码1、Database->EditCurrentDBMS,如下 2、PostgreSQL9.x->Script->Objects找到Column和Key;如下 3、将Column->SqlListQuery选项里SELECT中的c.attnotnull替换为cast(nullif(c.att......
  • 22级五年制C语言入门教程-(5)格式化输入输出
    1.输入和输出在程序的使用中,我们经常可以看的这么一个场景:用户需要输入数据,经过程序运算,得到结果后输出。在C语言中,输入数据和输出数据都是由库函数完成的,通过语句来输入/输出。2.格式化输出—printf()函数C语言程序运算的结果在内存中,我们需要将其输出到指定设备中,我们才可以......
  • 22级五年制C语言入门教程-(6)运算符
    1.运算符概述运算符是一种编译器执行特定的数学或逻辑操作的符号。C语言提供了以下类型的运算符:算术运算符关系运算符逻辑运算符位运算符赋值运算符条件运算符其他运算符2.算术运算符算术运算符分为单目运算符和双目运算符,单目运算符表示只需要一个操作数,双目运算符需......
  • 22级五年制C语言入门教程-(2)基本程序结构
    1.简单的C语言程序结构要建造房屋,首先需要打地基、搬砖搭建框架(这大概就是为什么叫搬砖的原因)。学习计算机语言的时候也一样,应该从基本的结构开始学起。下面,我们看一段简单的源代码,这段代码希望大家动手对着敲一遍,自己动手完完全全敲一次。我想对于刚学编程的人,即使对着敲,也是极......
  • 22级五年制C语言入门教程-(3)基本数据类型
    1.数据类型在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。C语言数据类型可以分为四种:1.基本类型:它们是算术类型,包括两种类型:整数类型和浮点类型。2.枚举类型:它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。3.void类型:类型......
  • 22级五年制C语言入门教程-(4)常量和变量
    1.常量和变量的概念程序执行过程中其值不能发生改变的量叫做常量,其值能发生改变的量叫做变量。常量可以直接使用,而变量则必须先定义后才能使用,否则编译器会报错。2.常量和变量的命名规范在介绍常量和变量的命名规范之前,我们先了解一下什么是标识符和关键字。2.1标识符标识符......
  • VS2022 17.12.0 Preview2版本对Copilot的功能增强
    前提条件,使用最新版的17.12.0Preview2,并且有有效的CopilotAI订阅,那么可以体验这些新鲜好用的功能增强了CopilotAI对IEnumerableVisualizer的可编辑表达式功能我们可以通过AI实现一些复杂的条件筛查,并且可以即时验证结果是否符合预期,对于开发和调试提供了极大的便利性......
  • 122. 买卖股票的最佳时机 II
    给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润 。 示例1:输入:prices=[7,1,5,3,6,4]输......
  • Windows Server 2022 rdp
    继续水一篇:2022废弃了xddm转而使用wddm,rdp的渲染有比较大的变化。高版本的unreal又需要2022支持,被迫走上魔改windows以提升2022rdp环境下抓屏帧数的道路。测试代码来自https://github.com/robmikh/Win32CaptureSample,只手动添加了输出fps逻辑。patchwindows后能在[60,90]......