C++ 入门09:友元函数和友元类

打印 上一主题 下一主题

主题 526|帖子 526|积分 1578

往期回顾:
   C++ 入门06:类的进阶(构造函数的重载与拷贝构造函数)-CSDN博客
  C++ 入门07:静态成员和常量成员-CSDN博客
  C++ 入门08:运算符重载-CSDN博客
  
一、媒介

在前面文章的学习中,我们了解了类和对象的根本知识、构造函数、拷贝构造函数、静态成员、常量成员以及运算符重载。今天,我们将学习 C++ 中的友元函数和友元类。友元使得非成员函数或其他类可以访问类的私有成员,从而提高了类的机动性和可扩展性。
二、友元函数和友元类

 2.1、 友元函数

(1)什么是友元函数?

友元函数(Friend Function)是一个被指定为某个类的友元的函数,尽管它不是该类的成员,但它可以访问该类的私有成员和保护成员。这种机制为类的封装性提供了一种机动的增补,通过友元函数,我们可以在类的外部定义一些操纵,即使不粉碎类的封装性,仍旧能够访问类的内部数据。
(2)声明友元函数

要在类中声明一个友元函数,你需要在类的定义体内部,使用friend关键字后跟友元函数的声明。friend关键字告诉编译器,这个特定的函数是类的友元,因此可以访问类的私有和保护成员。
语法:
  1. class ClassName {
  2.     friend 返回类型 函数名(参数列表);
  3. };
复制代码
示例:
假设我们有一个表示点的 Point 类,我们盼望定义一个函数来盘算两点之间的距离。由于距离盘算涉及访问点的私有成员变量,因此我们可以将这个函数声明为 Point 类的友元函数。
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. class Point {
  5. private:
  6.     double x, y;
  7. public:
  8.     Point(double x = 0, double y = 0) : x(x), y(y) {}
  9.     // 声明友元函数
  10.     friend double distance(const Point &p1, const Point &p2);
  11. };
  12. // 定义友元函数
  13. double distance(const Point &p1, const Point &p2) {
  14.     double dx = p1.x - p2.x;
  15.     double dy = p1.y - p2.y;
  16.     return sqrt(dx * dx + dy * dy);
  17. }
  18. int main() {
  19.     Point p1(3.0, 4.0);
  20.     Point p2(0.0, 0.0);
  21.     cout << "Distance: " << distance(p1, p2) << endl;
  22.     return 0;
  23. }
复制代码
在这个示例中,我们定义了一个 Point 类,并声明确一个友元函数 distance。这个友元函数可以访问 Point 类的私有成员 x 和 y,从而盘算两点之间的距离。 
注意事项:
1、友元关系不是相互的。如果函数A是类B的友元,并不意味着类B是函数A的友元或类B的成员函数可以访问函数A的内部状态。
2、友元关系不能继续。如果基类声明确一个友元函数,派生类不会自动继续这个友元关系。
3、友元可以粉碎类的封装性,因此应该谨慎使用。确保只在确实需要时才将函数声明为友元。
4、友元可以是其他类的成员函数,也可以是全局函数或命名空间中的函数。
2.2、 友元类 

(1)什么是友元类?

友元类(Friend Class)是一个被指定为某个类的友元的类,尽管它不是该类的成员,但它可以访问该类的私有成员和保护成员。通过友元类,我们可以在另一个类中访问当前类的私有成员,从而实现更紧密的类之间的协作。
(2)声明友元类

在类的定义中使用 friend 关键字声明友元类。
语法:
  1. class ClassName {
  2.     friend class FriendClassName;
  3. };
复制代码
示例:
假设我们有一个 Box 类,表示一个长方体的长、宽和高。我们盼望定义一个 BoxUtility 类,该类包罗一些用于操纵 Box 类的实用函数。为了让 BoxUtility 类访问 Box 类的私有成员,我们可以将 BoxUtility 声明为 Box 的友元类。
  1. #include <iostream>
  2. using namespace std;
  3. class Box {
  4. private:
  5.     double length, width, height;
  6. public:
  7.     Box(double l = 0, double w = 0, double h = 0) : length(l), width(w), height(h) {}
  8.     // 声明友元类
  9.     friend class BoxUtility;
  10. };
  11. class BoxUtility {
  12. public:
  13.     static double calculateVolume(const Box &box) {
  14.         return box.length * box.width * box.height;
  15.     }
  16.     static void displayDimensions(const Box &box) {
  17.         cout << "Length: " << box.length << ", Width: " << box.width << ", Height: " << box.height << endl;
  18.     }
  19. };
  20. int main() {
  21.     Box box(3.0, 4.0, 5.0);
  22.     cout << "Volume: " << BoxUtility::calculateVolume(box) << endl;
  23.     BoxUtility::displayDimensions(box);
  24.     return 0;
  25. }
复制代码
在这个示例中,我们定义了一个 Box 类,并声明确一个友元类 BoxUtility。BoxUtility 类包罗两个静态函数 calculateVolume 和 displayDimensions,它们可以访问 Box 类的私有成员 length、width 和 height,从而盘算体积并表现尺寸。 

以上就是 C++ 程序的友元函数和友元类的根本知识点了。通过友元函数和友元类,我们可以在类的外部访问其私有成员,从而实现更机动和紧密的类之间的协作。
都看到这里了,点个赞再走呗朋友~
加油吧,预祝大家变得更强!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表