文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++的友元和内部类你了解吗

2024-04-02 19:55

关注

友元分为:友元函数 和 友元类

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

友元函数

友元函数 可以 直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加 friend 关键字。

案例

friend ostream& operator<<(ostream& _cout, const Date& d);
friend istream& operator>>(istream& _cin, Date& d);

cout的输出流对象和隐含的this指针再抢占第一个参数的位置。 this 指针默认是第一个参数也就是左操作数。 但是实际使用中 cout 需要是第一个形参对象, 才能正常使用。

所以要将 operator<< 重载成全局函数。但是这样的话,又会导致类外没办法访问成员。所以这里就需要友元来解决。

友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

如果B是A的友元,C是B的友元,则不能说明C时A的友元。

class A;
class B;

class A {
	// 声明B类为A类的友元类,则在B类中就直接访问A类中的私有成员变量
	friend class B;
public:
	A (int a = 0)
		:_a(a)
	{}
private:
	int _a;
};

class B {
public:
	B(int b = 0)
		:_b(b)
	{}

	void SetA(int a)
	{
		// 直接访问A类私有的成员变量
		_aa._a = a;
	}
private:
	int _b;
	A _aa;
};

在这里插入图片描述

如果B不是A的友元类,报错。

内部类

如果一个类定义在另一个类的内部,这个内部类就叫做内部类。

此时这个内部类是一个独立的类,他不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。

注:

内部类就是外部类的友元类。

内部类可以通过外部类的对象参数来访问外部类中的所有成员,但是外部类不是内部类的友元。

class A {
private:
	int _a;
	static int _k;

public:
	class B {
	public :
		void print(const A& aa)
		{
			cout << aa._a << endl;
			cout << _k << endl;
		}
	};

	A(int a = 10)
		:_a(a)
	{}
};

int A::_k = 0;

int main()
{
	A::B bb;
	bb.print(A());
	return 0;
}

输出:

10
0

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯