马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
往期回顾:
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企服之家,中国第一个企服评测及商务社交产业平台。 |