IT评测·应用市场-qidao123.com
标题:
cpp-友元
[打印本页]
作者:
李优秀
时间:
2025-3-24 12:03
标题:
cpp-友元
理解 C++ 中的友元(Friend)
在 C++ 语言中,
封装(Encapsulation)
是面向对象编程的重要特性之一。它允许类将数据隐藏在私有(private)或受掩护(protected)成员中,防止外部直接访问。然而,在某些情况下,我们希望某些函数或类能够访问这些私有成员,而不粉碎封装性。这时,我们就需要
友元(Friend)
。
1. 什么是友元?
友元(friend)
是 C++ 提供的一种机制,它允许一个函数或另一个类访问某个类的私有和受掩护成员。友元有三种类型:
友元函数(Friend Function)
友元类(Friend Class)
友元成员函数(Friend Member Function)
2. 友元函数
友元函数是一个非成员函数,但它可以访问类的私有和受掩护成员。要声明友元函数,需要在类内部利用 friend 关键字。
示例:友元函数
#include <iostream>
using namespace std;
class Box {
private:
double width;
public:
Box(double w) : width(w) {}
// 声明友元函数
friend void printWidth(const Box &b);
};
// 定义友元函数
void printWidth(const Box &b) {
cout << "Width: " << b.width << endl;
}
int main() {
Box b(10.5);
printWidth(b);
return 0;
}
复制代码
在上面的示例中,printWidth 不是 Box 类的成员函数,但由于它被声明为 friend,它可以访问 Box 的私有成员 width。
3. 友元类
友元类允许一个类访问另一个类的私有和受掩护成员。
示例:友元类
#include <iostream>
using namespace std;
class Engine {
private:
int horsepower;
public:
Engine(int hp) : horsepower(hp) {}
// 声明 Car 为友元类
friend class Car;
};
class Car {
public:
void showEnginePower(const Engine &e) {
cout << "Engine horsepower: " << e.horsepower << endl;
}
};
int main() {
Engine e(150);
Car c;
c.showEnginePower(e);
return 0;
}
复制代码
在这个例子中,Car 是 Engine 的友元类,因此它可以访问 Engine 类的私有成员 horsepower。
4. 友元成员函数
我们还可以只将另一个类的某个成员函数设为友元,而不是整个类。
示例:友元成员函数
#include <iostream>
using namespace std;
class Engine;
class Car {
public:
void showEnginePower(const Engine &e);
};
class Engine {
private:
int horsepower;
public:
Engine(int hp) : horsepower(hp) {}
// 声明 Car::showEnginePower 为友元
friend void Car::showEnginePower(const Engine &e);
};
void Car::showEnginePower(const Engine &e) {
cout << "Engine horsepower: " << e.horsepower << endl;
}
int main() {
Engine e(200);
Car c;
c.showEnginePower(e);
return 0;
}
复制代码
这里 Car::showEnginePower 是 Engine 的友元成员函数,因此它可以访问 Engine 的私有成员。
5. 友元的应用场景
友元在以下情况中非常有效:
运算符重载
(如 operator<< 和 operator>> 需要访问类的私有成员)。
类之间的精密协作
(如 Car 需要访问 Engine 的私有数据)。
全局函数需要访问私有数据
(如调试函数、日志记录等)。
6. 友元的优缺点
优点:
允许外部函数/类访问私有数据,增强类之间的协作本领。
使操作符重载更加直观。
缺点:
粉碎了封装性,降低了数据的安全性。
可能导致代码耦合度增长。
7. 总结
友元函数
可以访问类的私有/受掩护成员,但不是类的成员。
友元类
允许另一个类访问本类的私有成员。
友元成员函数
允许一个类的特定成员函数访问本类的私有成员。
友元应该谨慎利用,制止粉碎封装性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4