类与对象(三)--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.友元关系不能继承

相关推荐
阿里嘎多学长几秒前
2026-04-30 GitHub 热点项目精选
开发语言·程序员·github·代码托管
qq_452396231 小时前
第十五篇:《UI自动化中的稳定性优化:解决flaky tests的七种武器》
运维·ui·自动化
abcnull1 小时前
用javaparser做精准测试
java·ast·静态代码分析·精准测试·javaparser
j_xxx404_1 小时前
Linux:静态链接与动态链接深度解析
linux·运维·服务器·c++·人工智能
叶小鸡1 小时前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
juniperhan2 小时前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
ID_180079054732 小时前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
_只道当时是寻常2 小时前
【Codex】Ubuntu 安装 Codex CLI 并解决 Clash 代理与账号认证问题
linux·ubuntu·chatgpt
c++之路2 小时前
C++23概述
java·c++·c++23