类与对象(三)--static成员、友元

文章目录

1.static成员

1.1概念🎧

🔎 static关键字用于声明类的静态成员变量和静态成员函数 。静态成员变量与特定的类相关联 ,而不是与类的实例相关联。它们的值对于类的所有实例都是共享的。另外,静态成员变量一定要在类外进行初始化

面试题✒️

实现一个类,计算程序中创建出了多少个类对象

cpp 复制代码
class A
{
public:
	A() {
		++_scount;
	}
	A(const A& t) {
		++_scount;
	}
	~A() {
		--_scount;
	}
	static int GetACount() {
		return _scount;
	}
private:
	static int _scount;
};

int A::_scount = 0;//初始化


void TestA()
{
	cout << A::GetACount() << endl;
	A a1, a2;
	A a3(a1);
	cout << A::GetACount() << endl;
}

✋以上代码中的A类成员变量用一个static修饰的变量_scount来记录实例化对象的个数。如果一个对象调用构造函数就会使_scount++,调用析构函数清理时又会使_scount--

1.2static的特性🎧

1️⃣. 静态成员为所有类对象所共享 ,不属于某个具体的对象,存放在静态区

2️⃣. 静态成员变量必须 在类外定义,定义时不添加static关键字 ,类中只是声明

3️⃣. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问

4️⃣. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员

5️⃣. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

1.3思考🎧

1.静态成员函数可以调用非静态成员函数吗?不行

显然,静态成员函数不与特定的类实例相关联,不访问非静态成员变量或非静态成员函数,因为它们没有 this 指针

  1. 非静态成员函数可以调用类的静态成员函数吗? 可以

2.友元

2.1什么是友元?🎧

在c++中,友元(Friend)是一种机制 ,允许一个类或函数访问另一个类的私有成员。通过使用友元关键字,可以将某个函数或类声明为另一个类的友元,从而赋予它对该类私有成员的访问权限。

2.2两种友元关系:🎧

1️⃣.函数友元 :一个函数被声明为另一个类的友元,使得该函数能够访问该类的私有成员

✋A类成员变量由于被private权限限制符修饰,不能被直接访问。现在我们将Print()函数声明为A类的友元函数,这样在Print()函数中就可以直接访问A类对象的私有变量_num了

2️⃣.类友元 :一个类被声明为另一个类的友元,使得该类的所有成员函数都能够访问该类的私有成员

✋B类的Print()函数中无法访问A类的私有成员,现在在A类中声明B类为友元类,这样一来就可以在B类中成功访问到A类的所有成员

⭐️值得注意的是
1.声明友元并不是相互的,是单向的

假设B是A的友元类,那么只允许B类访问A类的私有变量 ,但是A类不可以访问B类的私有变量,除非也将A类置为B类的友元。
2.友元关系不能传递

如果C是B的友元, B是A的友元,则不能说明C时A的友元
3.友元关系不能继承

相关推荐
励志的小陈1 小时前
贪吃蛇(C语言实现,API)
c语言·开发语言
QC班长1 小时前
Maven公司私库配置踩坑点
java·服务器·maven·intellij-idea
Makoto_Kimur1 小时前
java开发面试-AI Coding速成
java·开发语言
laowangpython2 小时前
Gurobi求解器Matlab安装配置教程
开发语言·其他·matlab
wengqidaifeng2 小时前
python启航:1.基础语法知识
开发语言·python
观北海2 小时前
Windows 平台 Python 极简 ORB-SLAM3 Demo,从零实现实时视觉定位
开发语言·python·动态规划
wuqingshun3141592 小时前
说说mybatis的缓存机制
java·缓存·mybatis
Elastic 中国社区官方博客2 小时前
为 Elastic Cloud Serverless 和 Elasticsearch 引入统一的 API 密钥
大数据·运维·elasticsearch·搜索引擎·云原生·serverless
空中海2 小时前
Kubernetes 生产实践、可观测性与扩展入门
java·贪心算法·kubernetes
Agent手记2 小时前
制造业数字化升级:生产全流程企业级智能体落地解决方案 —— 基于LLM+超自动化全栈架构的智改数转深度实战
运维·ai·架构·自动化