您的位置:首页 > 汽车 > 新车 > 商务网页_北京南站地铁几号线_新闻软文发布平台_网络营销方式方法

商务网页_北京南站地铁几号线_新闻软文发布平台_网络营销方式方法

2024/10/22 2:59:24 来源:https://blog.csdn.net/LJY_CF/article/details/143083665  浏览:    关键词:商务网页_北京南站地铁几号线_新闻软文发布平台_网络营销方式方法
商务网页_北京南站地铁几号线_新闻软文发布平台_网络营销方式方法

什么是友元(Friend)?👭

友元 (C++) | Microsoft Learn

在C++中,友元(Friend)是一种机制,允许外部函数或类访问某个类的私有(private)或保护(protected)成员

⚠️⚠️友元不是类的成员,但它能绕过封装限制,直接访问类中的私有数据。

2. 友元函数的定义与作用🆙
 

普通成员函数的访问限制

假设有一个类 Person,如下所示:

class Person {
private:std::string name;int age;
public:Person(std::string n, int a) : name(n), age(a) {}
};

在上面的例子中,name age 是私有成员,一般情况下不能从类外直接访问。

 友元函数如何访问私有数据

我们可以定义一个友元函数,允许它直接访问 Person 类的私有成员:

#include <iostream>
using namespace std;
class Person {
private:std::string name;int age;
public:Person(std::string n, int a) : name(n), age(a) {}// 声明友元函数friend void displayPersonInfo(const Person& p);
};// 友元函数的实现
void displayPersonInfo(const Person& p) {std::cout << "Name: " << p.name << ", Age: " << p.age << std::endl;
}int main() {Person p1("Alice", 30);displayPersonInfo(p1); return 0;
}

解释:

  • friend 关键字用于声明 displayPersonInfoPerson 类的友元函数。

  • 虽然 displayPersonInfo 不是 Person 类的成员,但它能访问 nameage

3. 友元类的概念与使用😮‍💨

除了友元函数,C++ 还允许一个类成为另一个类的友元,从而使该类的所有成员函数都能访问另一个类的私有成员。

友元类的示例:

#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) {std::cout << "Engine horsepower: " << e.horsepower << std::endl;}
};int main() {Engine engine(500);Car car;car.showEnginePower(engine);  return 0;
}

解释:

这里,CarEngine 的友元类,因此 Car 的成员函数可以访问 Engine 的私有数据 horsepower

4. 友元的实际案例:为什么以及何时使用?

典型使用场景:

  1. 重载运算符: 需要通过友元函数访问类的私有成员来实现运算符重载

  2. 辅助调试或测试: 有时为了更方便地测试类中的私有数据,可以使用友元。

  3. 跨类协作: 当两个类高度耦合时,可以通过友元类减少重复代码

例子:运算符重载

class Complex {
private:double real, imag;
public:Complex(double r, double i) : real(r), imag(i) {}// 声明友元函数重载 '+' 运算符friend Complex operator+(const Complex& c1, const Complex& c2);
};// 重载 '+' 运算符
Complex operator+(const Complex& c1, const Complex& c2) {return Complex(c1.real + c2.real, c1.imag + c2.imag);
}int main() {Complex c1(1.0, 2.0), c2(3.0, 4.0);Complex c3 = c1 + c2;std::cout << "Real: " << c3.real << ", Imag: " << c3.imag << std::endl;return 0;
}

解释:

  • operator+ 是一个友元函数,用于访问 Complex 类的私有成员 realimag

5. 注意事项⚠️

  1. 破坏封装性: 使用友元会暴露类的私有数据,容易破坏封装性,因此要慎用。

  2. 维护复杂性: 如果过多使用友元类或友元函数,类之间的耦合度会增加,导致代码难以维护。

6. 图解:类与友元的关系

图示:友元函数访问类的私有成员

说明:

图中展示了 Person displayPersonInfo 友元函数的关系。即使 nameage 是私有的,displayPersonInfo 仍然能访问它们。

 复盘吧💪

  • 友元函数友元类允许类的私有成员对外开放,但应谨慎使用。

  • 友元机制非常适用于重载运算符或跨类访问数据的情况,但滥用可能导致代码的耦合性和维护成本增加。

对类访问不是很理解的可以看这篇

C++类域访问方式(public,protected,private)对象访问 , 通过成员函数访问 ,通过友元函数访问-CSDN博客文章浏览阅读144次。C++类的域访问方式主要由访问修饰符控制。了解这些访问方式可以帮助我们设计更安全和可维护的类。通过合理的封装,可以有效保护数据的完整性。https://blog.csdn.net/LJY_CF/article/details/143084393?spm=1001.2014.3001.5502

共勉 💪

同为未来的it人让我们在共同进步吧。

我很喜欢雷军的一段话:我们就悄悄的干,就算失败了咱也不丢人。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com