友元

1. 友元类

例如,以下语句说明类B是类A的友元类:

       class A
       {
              …
       public:
              friend class B;
              …
       };

       经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。

使用友元类时注意:
             (1) 
友元关系不能被继承。 
             (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B
的友元,要看在类中是否有相应的声明。
             (3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明


表示关系的UML标记有如下四种:

1、聚类 (A聚合了B,B是A的一部分)

2、组合 (A是由B组成的,A包含B菱形的对象)

3、继承 (B攀升自A,A泛化了B)

4、依赖 (A依赖于B,A使用B)

1、is-a关系

 
图2-2中,Shap类下面的箭头的意思是,指向Shape的那些类派生自Shape类。
2、has-a关系

有两种不同的has-a关系。一个对象可以拥有另一个对象,其中被包含的对象是包含对象的一部分——或者不是。

图2-3中,表示出Airport“拥有”Aircraft。Aircraft并不是Airport的一部分,但仍然可以说Airport拥有aircraft,这种关系成为聚类 。
此外,图中还表示了Aircraft要么是Jet(喷气式飞机),要么是Helicopter(直升飞机)。也就是说,Airport可以拥有Jet或Helicopter,但它是以相同方式对待他们的(当作Aircraft)。Airport类右边是空心的(未填充的)菱形表示聚类关系。
  
另一种has-a关系是包含,被包含对象是包含对象的一部分,这种关系也称为组合 。
图2-4现实了Car(轿车)拥有Tire(轮胎),后者是它的一部分(也就是说,Car有Tire和其他东西组成),这种has-a关系,称为组合关系(composition),用实心菱形表示。此图上还显示了Car使用了GasStation(加油站)类,这种使用关系用带箭头的虚线表示,也称依赖关系(dependcncy relationship)。

组合和聚类都有“一个对象包含一个或多个对象”的意思,但是,组合意味着“被包含对象是包含对象的一部分”,而聚类意味着被包含对象更像是一个集合。我们可以认为组合是一种非共享的关联,被包含对象的生存周期由包含对象控制。


<think>首先,用户的问题是:“我想了解函数的相关信息 请问函数的概念、特点和使用方法”。我需要基于系统指令和参考引用来回答。 系统指令: - 所有行内数学表达式必须使用$...$格式。例如:$x^2$。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1]。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 用户可见层:回答结构清晰,逐步解决问题。 参考引用: - 引用[1]:函数的概念,破坏封装性,提高效率。 - 引用[2]:函数的定义、特点,如非成员函数访问私有成员。 - 引用[3]:示例代码,展示另一个类的成员函数作为。 我需要组织回答: 1. **概念**:解释函数是什么。 2. **特点**:列出函数的特点。 3. **使用方法**:如何声明和使用函数,包括示例代码。 4. **注意事项**:优缺点。 5. **生成相关问题**:在末尾添加相关问题。 确保使用中文。 结构: - 开头简要介绍。 - 分点解释概念、特点、使用方法。 - 提供代码示例。 - 添加引用标识。 - 最后生成相关问题。 从引用中提取信息: - 概念:函数是一种能够访问类中私有成员的非类成员函数。[^1] - 特点:非成员函数;访问私有和保护成员;声明用friend关键字;提高效率但破坏封装。[^1][^2] - 使用方法:在类定义中声明friend,定义在类外。[^2][^3] - 示例:引用[3]提供了代码示例。 添加自己的知识以确保真实可靠: - 函数常用于运算符重载或需要外部函数访问私有数据时。 - 示例:重载<<运算符用于输出。 数学表达式:用户问题中没有数学,但如果有,要用$...$。这里可能不需要数学。 生成相关问题: - 类似示例中的格式:§§相关问题§§ - 基于主题:函数。 相关问题想法: 1. 函数与成员函数的区别? 2. 函数在哪些场景下最有用? 3. 类是什么?如何声明? 完整回答: - 先回答用户问题。 - 结束时添加相关问题。</think>### 函数的概念、特点和使用方法 函数是C++中的一个特殊机制,它允许非成员函数访问类的私有(private)和保护(protected)成员。这提高了代码的灵活性,但需谨慎使用以避免破坏封装性。下面我将逐步解释其概念、特点和使用方法,确保内容真实可靠,并基于C++标准。 #### 1. **概念** 函数(Friend Function)是一种被声明为“”的普通函数,它不是类的成员函数,但能直接访问类的私有数据。这主要用于需要外部函数操作类内部数据的场景,如运算符重载或工具函数。例如,在数学应用中,函数可以方便地处理类中的私有变量,如计算点积或矩阵运算: $$ \text{点积} = \mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{n} a_i b_i $$ 其中,函数可直接访问向量类的私有坐标值[^1][^2]。 #### 2. **特点** 函数具有以下核心特点: - **非成员性**:函数不是类的成员,因此定义和调用方式与普通函数相同,无需通过对象实例。 - **访问权限**:它能访问类的所有成员(包括私有和保护成员),这突破了类的封装限制。 - **声明方式**:在类定义内部使用`friend`关键字声明,声明位置灵活(通常放在类开头或结尾以提高可读性)。 - **效率优势**:在需要频繁访问私有数据的场景(如高性能计算),函数可避免getter/setter的开销,提升运行效率。 - **封装破坏**:过度使用会削弱类的封装性,增加代码耦合度,因此只应在必要时使用,如实现全局运算符或跨类协作[^1][^2]。 #### 3. **使用方法** 函数的声明和定义需遵循特定步骤,下面结合代码示例说明。示例基于引用[2][^2]和引用[3][^3],展示一个简单场景:另一个类的成员函数作为。 ##### 步骤1:在类中声明函数 使用`friend`关键字在类定义内声明函数。函数可以是全局函数或另一个类的成员函数。 ```cpp #include <iostream> using namespace std; // 前置声明类,用于声明 class Object; class Base { private: int value; // 私有成员变量 public: Base(int x = 0) : value(x) {} // 构造函数 // 声明Object类的成员函数为函数 friend void Object::fun(Base& base); }; class Object { public: void fun(Base& base); // 成员函数声明 }; // Object成员函数的定义 void Object::fun(Base& base) { base.value += 10; // 函数可直接访问Base的私有成员 cout << "更新后的值: " << base.value << endl; } ``` ##### 步骤2:定义和使用函数 函数定义在类外,调用时无需对象引用(但需确保作用域可见)。 ```cpp int main() { Base b(5); // 创建Base对象,初始value=5 Object obj; // 创建Object对象 obj.fun(b); // 调用函数,输出: 更新后的值: 15 return 0; } ``` **关键点**: - 声明时,`friend`关键字只用于类内,函数定义无需重复。 - 如果函数是全局函数(非成员),声明更简单: ```cpp class Base { friend void globalFun(Base& base); // 全局函数声明 }; void globalFun(Base& base) { /* 访问私有成员 */ } ``` - **适用场景**:运算符重载(如`<<`输出运算符)、跨类数据共享或数学计算函数(例如,计算两个对象的欧几里得距离:$d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}$)[^2][^3]。 #### 4. **注意事项** - **优点**:提高代码效率,简化接口,尤其在需要外部函数处理类内部逻辑时。 - **缺点**:破坏封装性,增加维护难度。建议仅在必要时使用,并优先考虑成员函数或设计模式(如工厂模式)。 - **最佳实践**:限制数量,并配合文档说明,以减少风险[^1][^2]。 通过以上步骤,您可安全地使用函数来增强C++程序的灵活性。如需深入,请参考C++标准文档或权威教程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值