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 类的私有成员 xy,从而计算两点之间的距离。 

注意事项:

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 类,并声明了一个友元类 BoxUtilityBoxUtility 类包含两个静态函数 calculateVolumedisplayDimensions,它们可以访问 Box 类的私有成员 lengthwidthheight,从而计算体积并显示尺寸。 


以上就是 C++ 程序的友元函数和友元类的基础知识点了。通过友元函数和友元类,我们可以在类的外部访问其私有成员,从而实现更灵活和紧密的类之间的协作。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值