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

相关推荐
湫ccc29 分钟前
《Python基础》之字符串格式化输出
开发语言·python
弗拉唐29 分钟前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
sun00770030 分钟前
ubuntu dpkg 删除安装包
运维·服务器·ubuntu
海岛日记33 分钟前
centos一键卸载docker脚本
linux·docker·centos
oi771 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
mqiqe1 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin1 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python