静态数据成员与静态成员函数

静态数据成员与静态成员函数,第1张

静态数据成员静态成员函数

一,静态数据成员
需求分析:
需要获取总的人数,如何实现?

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

缺点:使用全局变量不方便,破坏程序的封装性。(全局变量容易被修改,其他人可能也用到这个全局变量,这样的话就会被重定义。开发中少用,或者尽量不用全局变量)

关于这个缺点的解决方案:
使用类的静态成员。

头文件:Human.h

class Human {
public:
int getCount();
private:
	string name = "Unknown";
	int age = 28;

	// 类的静态成员
	static int count;
};

初始化类中的静态成员:
在类Human的实现文件:Human.cpp,中初始化:

#include "Human.h"	

// 初始化类的静态成员
int Human::count = 0;

Human::Human() {
	cout << "调用构造函数:" << this << endl;
	name = "无名氏";
	age = 18;
	salary = 30000;

	addr = new char[ADDR_LEN];
	strcpy_s(addr, ADDR_LEN, "China");

	count++;
}

// 类的普通成员函数,可以直接访问静态成员(可读可写)
int Human::getCount() {
	//count = 100; //可以在类的public方法中访问静态成员,不建议这样写,不规范
	return count;
}

主函数main.cpp文件中的实现:

#include "Human.h"

int main(void) {
	Human h1;
	cout << h1.getCount() << endl;

	Human h2;
	cout << h1.getCount() << endl;

	system("pause");
	return 0;
}

对于非const的类静态成员,只能在类的实现文件中初始化。
const类静态成员,可以在类内设置初始值,也可以在类的实现文件中设置初始值。(但是不要同时在这两个地方初始化,只能初始化1次)

二,静态成员函数
关于静态数据成员中,getCount的讨论:
当需要获取总的人数时,还必须通过一个对象来访问,比如h1.getCount().
如果当前没有可用的对象时,就非常尴尬,不能访问getCount()!

void test() {
	cout << "总人数: ";
	// ??? 没有可用的对象来访问getCount()
}

如果为了访问总的人数,而特意去创建一个对象,就很不方便,
而且得到的总人数还不真实(包含了一个没有实际用处的人),如下:

void test() {
	Human tmp; //创建一个对象来访问getCount()

	cout << "总人数: " << tmp.getCount() << endl;
}

如何解决呢???
解决方案:
把getCount()方法定义为类的静态方法!

类的静态方法:
1.可以直接通过类来访问【更常用】,也可以通过对象(实例)来访问。
2.在类的静态方法中,不能访问普通数据成员和普通成员函数(对象的数据成员和成员函数)
Human.h:

#pragma once
......
class Human {
public:
	static int getCount();
};

Human.cpp:

//静态方法的实现,不能加static
int Human::getCount() { 
	//  静态方法中,不能访问实例成员(普通的数据成员)
	// cout << age;

	// 静态方法中,不能访问this指针
	// 因为this指针是属于实例对象的
	// cout << this;

	// 静态方法中,只能访问静态数据成员
	return count;
}

main.cpp:

void test() {
	// 直接通过类名来访问静态方法!
	// 用法:类名::静态方法
	cout << Human::getCount(); 
}

int main(void) {
	Human h1, h2;

	test();

	return 0;
}

图像说明:

总结:
1)静态数据成员
对象的成员函数(没有static的成员函数)内部,可以直接访问“静态数据成员”
类的静态成员函数(有static的成员函数)内部,可以直接访问“静态数据成员”
即:所有的成员函数,都可以访问静态数据成员。

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

2)静态成员函数
对象可以直接访问静态成员函数
类可以直接访问静态成员函数(Human::getHumanCount())
在类的静态成员函数(类的静态方法)内部,不能直接访问this指针和对象的数据成员!
在类的静态成员函数(类的静态方法)内部,只能访问类的数据成员,也就是静态数据成员!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5691488.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存