38友元

简介: 38友元

C++入门——60s从0到1

友元

 

在C++中,友元是一种特殊的机制,它允许一个类或函数访问另一个类中的私有成员。友元可以公开一个类的接口,以便其他代码可以访问类的私有成员。

 

友元的概念

 

友元是一种特殊的机制,它允许一个类或函数访问另一个类中的私有成员。在C++中,类中的私有成员默认是只允许在类的内部访问的。如果其他代码需要访问这些成员,可以通过将它们声明为友元来实现。友元可以公开一个类的接口,以便其他代码可以访问类的私有成员。

 

友元的声明

 

在C++中,友元可以在类定义中进行声明。语法如下:

 

class MyClass {

   friend class OtherClass; // 声明 OtherClass 为 MyClass 的友元类

   friend void foo(); // 声明 foo() 为 MyClass 的友元函数

   int x, y; // 其他成员变量和函数...

};

 

在此示例中,声明了一个友元类`OtherClass`和一个友元函数`foo()`。这些友元类和友元函数可以访问`MyClass`中的私有成员。

 

友元的使用

 

友元可以用于访问类的私有成员,它们通常被用于以下场景:

 

1. 访问私有成员:通过将其他代码声明为友元,可以使其访问类的私有成员。这可以帮助我们更好地封装代码,同时提供必要的接口以供其他代码使用。

 

2. 提供接口:通过将其他代码声明为友元,可以为其提供访问类接口的权限。这可以帮助我们更好地封装代码,并提供必要的接口以供其他代码使用。

 

3. 实现特定的操作:通过将其他代码声明为友元,可以为它们提供对特定操作的权限。这可以帮助我们更好地封装代码,并提供特定的功能以供其他代码使用。

 

友元函数的使用

 

友元函数是一种特殊的函数,它可以访问类的私有成员。通常情况下,我们需要在类外部定义一个函数来实现特定的操作,并将该函数声明为该类的友元函数。下面是一个示例:

 

class MyClass {
private:
    int x, y; // 私有成员变量
public:
    void print() {
        cout << "x = " << x << ", y = " << y << endl;
    }
    friend void print(MyClass&); // 将 print() 声明为 MyClass 的友元函数
};
 
void print(MyClass& obj) { // 在函数定义中可以直接访问类的私有成员
    cout << "x = " << obj.x << ", y = " << obj.y << endl;
}

 

在此示例中,我们在类`MyClass`中定义了一个私有成员变量`x`和`y`,并将其公开在一个名为`print()`的公有成员函数中。我们还定义了一个名为`print()`的友元函数,它接受一个`MyClass`类型的参数对象,并在控制台输出该对象的私有成员变量值。最后我们在主函数中创建了一个`MyClass`类型的对象并调用了它的`print()`函数。

 

友元类的使用

 

友元类是一种特殊的类类型,它可以访问另一个类的所有成员(包括私有成员)。通常情况下,我们需要定义一个类来实现特定的操作,并将该类声明为另一个类的友元类。下面是一个示例:

 

class MyClass {
private:
    int x, y; // 私有成员变量
public:
    void print() { // 其他公有成员函数...
        cout << "x = " << x << ", y = " << y << endl;
    }
    friend class OtherClass; // 将 OtherClass 声明为 MyClass 的友元类
};
 
class OtherClass { // OtherClass 是 MyClass 的友元类类型
public: // OtherClass 的公有成员函数...
    void doSomething(MyClass& obj) { // 在 OtherClass 中可以直接访问 MyClass 的私有成员变量和公有成员函数
        obj.x = 10; obj.y = 20; obj.print(); // 对 MyClass 的私有成员进行赋值并调用公有成员函数 print()
    }   
};

在此示例中,我们在`MyClass`中定义了两个私有成员变量和一个名为`print()`的公有成员函数。我们还定义了一个名为`OtherClass`的友元类类型,并在其中定义了一个名为`doSomething()`的公有成员函数。该函数接受一个指向`MyClass`类型的参数对象的对象引用,并在控制台中对参数对象的私有成员进行赋值并调用公有成员函数`print()`来输出结果。最后我们在主函数中创建了一个`MyClass`类型的对象和一个`OtherClass`类型的对象并调用了它们的相应函数来测试结果。

目录
相关文章
|
8月前
|
人工智能 自然语言处理 自动驾驶
AVD2:清华联合复旦等机构推出的自动驾驶事故视频理解与生成框架
AVD2 是由清华大学联合多所高校推出的自动驾驶事故视频理解与生成框架,结合视频生成与事故分析,生成高质量的事故描述、原因分析和预防措施,显著提升自动驾驶系统的安全性和可靠性。
186 6
|
前端开发
CSS网页布局综合练习(涵盖大多CSS知识点)
CSS网页布局综合练习(涵盖大多CSS知识点)
|
XML 计算机视觉 数据格式
数据集学习笔记(四):VOC转COCO数据集并据txt中图片的名字批量提取对应的图片并保存到另一个文件夹
这篇文章介绍了如何将VOC数据集转换为COCO数据集的格式,并通过Python脚本根据txt文件中列出的图片名称批量提取对应的图片并保存到另一个文件夹。
216 3
|
存储 弹性计算 固态存储
阿里云服务器按量付费是什么?划算吗?
阿里云ECS按量付费模式,先使用后付费,按小时结算,适合临时扩展、测试、电商抢购等短期应用。开通需账户余额不低于100元。实例、镜像、云盘、带宽等支持按量计费,价格根据配置和地区而异。可随时转为包年包月。
2141 1
|
程序员 Python
老程序员分享:python
老程序员分享:python
|
Ubuntu 编译器 Linux
C语言编译过程分享
C语言编译过程详解
|
人工智能 运维 搜索推荐
电商行业实践专栏上线|阿里巴巴风控实战如何解决大规模风控的技术难点?
Flink-learning 学训平台第 4 期课程——电商行业实践专栏上线啦!
947 0
电商行业实践专栏上线|阿里巴巴风控实战如何解决大规模风控的技术难点?
概率统计中最重要的概念:概率统计与马尔可夫链的理解
概率统计中最重要的概念:概率统计与马尔可夫链的理解
372 0
概率统计中最重要的概念:概率统计与马尔可夫链的理解
|
缓存 算法 NoSQL
Yii2.0框架一共有哪些性能提升方法?底层原理是什么?
Yii2.0框架一共有哪些性能提升方法?底层原理是什么?
232 0