【C/C++】类之间的横向关系

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


类之间的关系可以分为横向关系和纵向关系,本文介绍类之间的横向关系

一、组合

组合(Composition):表示一种拥有的关系,它使一个类成为另一个类的一部分。

组合关系是一种强依赖关系,如果父对象销毁,则子对象也将被销毁。

组合是包含与被包含的关系。组合是一个类中包含另一个类对象。
组合是一种强所属关系,组合关系的两个对象往往具有相同的生命周期,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。
一般来说被组合对象不能脱离组合对象独立存在,整体不存在,部分一定不存在。

例如:人与手、人与头之间的关系,人需要包含头和手,头、手是人的一部分且不能脱离人独立而存在

在这里插入图片描述

二、关联

关联(Association) 关联是指一个类与另一个类存在连接关系,但是两个类的对象之间不是强制性的,一个类的对象可以独立存在。关联关系可以是单向的或者双向的。在双向关联中,两个类对象互相包含对方的引用。

关联不是从属关系,而是平等关系,可以拥有对方,但不可占有对方
。完成某个功能与被关联的对象有关,但是可有可无。
被关联的对象与关联的对象无生命周期约束关系,被关联对象的生命周期由谁创建就由谁来维护。
只要二者同意,可以随时解除关系或是进行关联,被关联的对象还可以再被别的对象关联,所以关联是可以共享的

举例:人和朋友的关系,人要完成玩游戏这个功能,没有朋友可以自己玩游戏,如果交到朋友了就可以和朋友一起玩游戏。

在这里插入图片描述

三、依赖

依赖(Dependency) 依赖是指一个类使用另一个类的对象,但是这种依赖关系是暂时性的,不会持久存在。如果一个类的方法需要调用另一个类的对象,那么这种调用就是一种依赖关系。

一个对象的某种行为依赖于另一个类对象,被依赖的对象视为完成某个功能的工具,并不持有对他的引用,只有在完成某个功能的时候才会用到,而且是必不可少的。
依赖之间没有生命周期约束关系。

举例:人要完成玩电脑,就需要用到电脑,电脑作为一个工具,其他的时候不需要,电脑也不可能作为人的属性而存在(非组合关系) ,人必须依赖于电脑才能玩电脑。

在这里插入图片描述

四、聚合

聚合(Aggregation) 聚合是指一个类包含另一个类的对象,但是这个对象的生命周期可以独立存在。聚合是一种弱关联,一个类的对象可以存在,即使包含这个对象的类对象不在了。

多个被聚合的对象聚集起来形成一个大的整体,聚合的目的是为了统一进行管理同类型的对象,聚合是一种弱所属关系,被聚合的对象还可以再被别的对象关联,所以被聚合对象是可以共享的。
虽然是共享的,聚合代表的是一种更亲密的关系,相当于强版本的关联。

举例:多个人一起玩游戏进行统一管理

在这里插入图片描述

代码举例类之间的横向关系

#include <iostream>
#include <string>
using namespace std;
class CHand
{
public:
	void Move()
	{
		cout << "手移动" << endl;
	}
};
class CComputer
{
public:
	void Compile()
	{
		cout << "编译程序...生成可执行文件" << endl;
	}
};
class CFriend
{
public:
	void Play()
	{
		cout << "朋友玩LOL很好" << endl;
	}
};
class CPeople
{
public:
	CHand m_hand;
	CFriend* m_pFri;
	CPeople() :m_pFri(nullptr)
	{

	}
	void clap()
	{
		m_hand.Move();
		cout << "鼓掌" << endl;
	}
	void code(CComputer* pComp)
	{
		if (!pComp)return;
		m_hand.Move();
		cout << "敲代码" << endl;
		pComp->Compile();
		cout << "运行程序" << endl;
	}
	void playLOL()
	{
		if (m_pFri)
		{
			m_pFri->Play();
			cout << "和朋友玩LOL" << endl;
		}
		else
		{
			cout << "没朋友自己玩LOL" << endl;
		}
	}
};

int main()
{
	//组合
	{
		CPeople peo;
		peo.clap();
	}
	//依赖
	{
		CComputer comp;
		CPeople ztx;
		ztx.code(&comp);

	}
	//关联
	{
		CPeople peo;
		peo.playLOL();	//自己玩

		CFriend fri;
		peo.m_pFri = &fri;
		peo.playLOL();	//一起玩
	}


	return 0;
}

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
<think>好的,我现在需要帮助用户了解C++之间友元关系型及其横向关系。首先,我得回顾一下C++中的友元机制。根据引用[2],友元在C++中是单向的,每个声明只能让一个或方法成为友元。而其他语言如Golang或Java则可能采用包或内部的方式,范围更广。用户的问题集中在C++,所以我要专注于C++的情况。 用户提到“型及横向关系”,可能需要我将友元关系按照不同的方式进行分。首先,友元可以是函数、另一个的成员函数,或者整个。例如,A可以声明B为友元,这样B的所有成员函数都可以访问A的私有成员。此外,友元关系不具备传递性,即如果A是B的友元,B是C的友元,A不一定是C的友元。这点需要明确说明。 接下来,横向关系可能指的是之间的不同关系,比如组合、继承等。根据引用[1],组合是"has-a",继承是"is-a",而友元可能属于另一种横向关系,比如协作关系。友元通常用于需要紧密协作的,比如运算符重载时,需要让运算符函数访问的私有成员,这时候就需要友元声明。引用[3]中的例子提到了运算符重载,可能此相关。 然后,我需要分友元关系型。可能分为:1) 普通友元,即一个声明另一个为友元;2) 友元成员函数,即只允许另一个的特定成员函数访问;3) 友元函数,非成员函数或另一个的非成员函数。例如,在运算符重载中,通常会声明全局函数为友元。 横向关系的分可能需要考虑友元关系的方向性和范围。例如,单向友元(A是B的友元,但B不是A的友元)和双向友元(需要双方互相声明)。根据引用[2],C++的友元是单向的,每次声明只能单向开放权限。因此,双向友元需要两个各自声明对方为友元。 此外,友元关系继承、组合的区别也很重要。友元不涉及继承层次,也不表示部分整体的关系,而是允许特定的外部或函数访问私有成员。这种关系应该谨慎使用,因为会破坏封装性。 最后,需要确保回答结构清晰,按照用户的要求分点说明,并引用相关的资料。比如引用[2]说明C++友元的单向性,引用[3]的例子可能涉及到友元在运算符重载中的应用。</think>### C++之间的友元关系横向关系解析 在C++中,友元关系是一种特殊的访问控制机制,其型和横向关系可分如下: --- #### 一、友元关系型 1. **单向友元关系** A显式声明B为友元(`friend class B;`),此时B可以访问A的私有成员,但A不能访问B的私有成员。 示例: ```cpp class A { friend class B; // B是A的友元 int secret; }; class B { void accessA(A& a) { a.secret = 1; } }; // B可访问A的私有成员 ``` 2. **双向友元关系** 若AB互相声明对方为友元,则形成双向访问权限。需显式双向声明: ```cpp class A { friend class B; }; class B { friend class A; }; ``` 3. **受限友元关系** 仅开放给特定成员函数,而非整个。例如: ```cpp class A { friend void B::specificMethod(); // 仅允许B的specificMethod访问 }; ``` 4. **全局函数友元** 非成员函数可被声明为友元,常用于运算符重载场景[^3]: ```cpp class Point { friend Point operator+(const Point& p1, const Point& p2); }; ``` --- #### 二、横向关系 1. **协作型关系** 友元常用于需要紧密协作但无继承或组合关系(如数据结构迭代器)。例如:链表`LinkedList`声明迭代器`Iterator`为友元以访问节点指针。 2. **功能扩展关系** 通过友元实现运算符重载或工具函数,扩展功能。例如:矩阵`Matrix`声明全局乘法函数为友元以实现`Matrix operator*(...)`。 3. **打破封装的特例** 友元关系会破坏封装性,因此通常用于特定场景(如性能优化或框架设计)[^2]。 --- #### 三、其他关系的对比 | 关系型 | 描述 | 示例 | 特点 | |----------|---------------------|--------------------|-----------------------| | 友元 | 单向/双向访问授权 | 矩阵乘法运算符 | 打破封装,高度灵活 | | 继承 | "is-a"关系[^1] | 矩形继承自点 | 层次化,子扩展父 | | 组合 | "has-a"关系[^1] | 汽车包含发动机 | 部分-整体,强封装性 | --- #### 四、设计建议 1. **最小化友元使用**:优先通过公共接口或组合实现交互。 2. **明确协作边界**:仅对必要的方法或开放友元权限[^2]。 3. **避免循环依赖**:双向友元可能导致代码耦合。 --- 相关问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值