当前位置: 首页 > news >正文

理解c++中关键字友元friend的作用

理解c++中关键字友元friend的作用

friend 关键字在 C++ 中用于声明一个函数或类为另一个类的友元。
友元函数或友元类可以访问该类的私有(private)和保护(protected)成员。

友元函数

作用:
允许非成员函数访问私有成员:
如果一个函数被声明为某个类的友元,它可以直接访问该类的私有(private)和保护成员(protected)

如果成员函数没有被声明为friend,则该函数体内无法访问类内私有成员

#include<iostream>
class MyClass {
private:int value;
public://默认构造函数MyClass(int v) : value(v){}//声明函数,没有用友元声明,这样该函数内无法访问类内私有成员void printValue(const MyClass& obj);
};//定义函数
void printValue(const MyClass &obj) {//该函数调用对象obj的私有成员value//由于该函数在声明时没有被friend修饰了,所以此函数体内无法访问类内私有成员std::cout<< "Value:"<< obj.value << std::endl;
}
int main() {MyClass obj(42);printValue(obj);return 0;
}


我们把printValue函数用friend声明,这样该函数体内就能访问类的私有成员了

#include<iostream>
class MyClass {
private:int value;
public://默认构造函数MyClass(int v) : value(v){}//声明友元函数friend void printValue(const MyClass& obj);
};//定义函数
void printValue(const MyClass &obj) {//该函数调用对象obj的私有成员value//由于该函数在声明时被friend修饰了,所以此函数体内可以访问类内私有成员std::cout<< "Value:"<< obj.value << std::endl;
}
int main() {MyClass obj(42);printValue(obj);return 0;
}

注意:
友元破坏了封装性,应谨慎使用。
友元关系是单向的,且不能传递。例如,A 是 B 的友元,但 B 不是 A 的友元。

友元类

#include <iostream>// 前向声明
class FriendClass;class MainClass {
private:int privateValue;public:MainClass(int value) : privateValue(value) {}// 声明FriendClass为友元类friend class FriendClass;void display() {std::cout << "MainClass的privateValue: " << privateValue << std::endl;}
};// 友元类
class FriendClass {
public:void accessPrivateData(const MainClass& obj) {// 可以直接访问MainClass的私有成员std::cout << "FriendClass访问MainClass的privateValue: " << obj.privateValue << std::endl;}void modifyPrivateData(MainClass& obj, int newValue) {// 可以修改MainClass的私有成员obj.privateValue = newValue;std::cout << "FriendClass修改了MainClass的privateValue为: " << obj.privateValue << std::endl;}
};int main() {MainClass mainObj(42);mainObj.display();FriendClass friendObj;friendObj.accessPrivateData(mainObj);friendObj.modifyPrivateData(mainObj, 100);mainObj.display();return 0;
}

这个例子中,MainClass通过friend class FriendClass;语句将FriendClass声明为友元类,因此FriendClass的所有成员函数都可以直接访问MainClass的私有成员privateValue。
注意,友元关系是单向的,FriendClass可以访问MainClass的私有成员,但MainClass不能访问FriendClass的私有成员。

相关文章:

  • 使用nps配置内网穿透加域名解析
  • C++二项式定理:原理、实现与应用
  • nvidia-smi-Failed to initialize NVML: Driver/library version mismatch
  • Newton 迭代
  • Openlayers:如何注册一个新的坐标系统
  • 【数字图像处理】半开卷复习提纲
  • 建筑迈向绿色发展之路,楼宇自控成建筑可持续发展关键技术
  • 室内定位:热门研究方向与未解难题深度解析
  • 培训机构教务管理系统软件的功能有哪些?
  • 【c语言】动态内存分配
  • Python继承
  • 全息美AISEO引领AIGEO新趋势
  • C++ 函数声明,定义与命名空间的关系
  • Linux操作
  • 25.第二阶段x64游戏实战-分析物品相关数据
  • CoreDNS 的无状态设计与动态数据源
  • 044-代码味道-数据类
  • 《Deepseek从入门到精通》清华大学中文pdf完整版
  • 基于智能推荐的就业平台的设计与实现(招聘系统)(SpringBoot Thymeleaf)+文档
  • VTEP是什么
  • 美国务卿会见叙利亚外长,沙特等国表示将支持叙利亚重建
  • 新城悦服务:独董许新民辞任,新任独董与另两人组成调查委员会将调查与关联方资金往来
  • 媒体:中国女排前队长朱婷妹妹被保送浙大受质疑,多方回应
  • 一船明月过沧州:为何这座城敢称“文武双全”?
  • 人民日报:从“轻微免罚”看涉企执法方式转变
  • 呼吸医学专家杜晓华博士逝世,终年50岁