伤心客 发表于 2024-7-15 15:13:06

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

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

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

 2.1、 友元函数

(1)什么是友元函数?

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

要在类中声明一个友元函数,你需要在类的定义体内部,使用friend关键字后跟友元函数的声明。friend关键字告诉编译器,这个特定的函数是类的友元,因此可以访问类的私有和保护成员。
语法:
class ClassName {
    friend 返回类型 函数名(参数列表);
};
示例:
假设我们有一个表示点的 Point 类,我们盼望定义一个函数来盘算两点之间的距离。由于距离盘算涉及访问点的私有成员变量,因此我们可以将这个函数声明为 Point 类的友元函数。
#include <iostream>
#include <cmath>
using namespace std;

class Point {
private:
    double x, y;

public:
    Point(double x = 0, double y = 0) : x(x), y(y) {}

    // 声明友元函数
    friend double distance(const Point &p1, const Point &p2);
};

// 定义友元函数
double distance(const Point &p1, const Point &p2) {
    double dx = p1.x - p2.x;
    double dy = p1.y - p2.y;
    return sqrt(dx * dx + dy * dy);
}

int main() {
    Point p1(3.0, 4.0);
    Point p2(0.0, 0.0);

    cout << "Distance: " << distance(p1, p2) << endl;

    return 0;
}
在这个示例中,我们定义了一个 Point 类,并声明确一个友元函数 distance。这个友元函数可以访问 Point 类的私有成员 x 和 y,从而盘算两点之间的距离。 
注意事项:
1、友元关系不是相互的。如果函数A是类B的友元,并不意味着类B是函数A的友元或类B的成员函数可以访问函数A的内部状态。
2、友元关系不能继续。如果基类声明确一个友元函数,派生类不会自动继续这个友元关系。3、友元可以粉碎类的封装性,因此应该谨慎使用。确保只在确实需要时才将函数声明为友元。4、友元可以是其他类的成员函数,也可以是全局函数或命名空间中的函数。 2.2、 友元类 

(1)什么是友元类?

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

在类的定义中使用 friend 关键字声明友元类。
语法:
class ClassName {
    friend class FriendClassName;
};
示例:
假设我们有一个 Box 类,表示一个长方体的长、宽和高。我们盼望定义一个 BoxUtility 类,该类包罗一些用于操纵 Box 类的实用函数。为了让 BoxUtility 类访问 Box 类的私有成员,我们可以将 BoxUtility 声明为 Box 的友元类。
#include <iostream>
using namespace std;

class Box {
private:
    double length, width, height;

public:
    Box(double l = 0, double w = 0, double h = 0) : length(l), width(w), height(h) {}

    // 声明友元类
    friend class BoxUtility;
};

class BoxUtility {
public:
    static double calculateVolume(const Box &box) {
      return box.length * box.width * box.height;
    }

    static void displayDimensions(const Box &box) {
      cout << "Length: " << box.length << ", Width: " << box.width << ", Height: " << box.height << endl;
    }
};

int main() {
    Box box(3.0, 4.0, 5.0);

    cout << "Volume: " << BoxUtility::calculateVolume(box) << endl;
    BoxUtility::displayDimensions(box);

    return 0;
}
在这个示例中,我们定义了一个 Box 类,并声明确一个友元类 BoxUtility。BoxUtility 类包罗两个静态函数 calculateVolume 和 displayDimensions,它们可以访问 Box 类的私有成员 length、width 和 height,从而盘算体积并表现尺寸。 
以上就是 C++ 程序的友元函数和友元类的根本知识点了。通过友元函数和友元类,我们可以在类的外部访问其私有成员,从而实现更机动和紧密的类之间的协作。
都看到这里了,点个赞再走呗朋友~
加油吧,预祝大家变得更强!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: C++ 入门09:友元函数和友元类