💪 专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《图像增强》
📝《模型优化》
📝《模型实战部署》
📝《图像配准融合》
📝《数据集》
📝《高效助手》
📝《C++》
📝《Qt》
一、成员函数作为友元函数
1.1 理论
在 C++ 中,友元机制允许一个函数或类直接访问另一个类的私有(private)或受保护(protected)成员。
通常,声明友元时可以是普通函数、全局函数,甚至是另一个类,但特殊的是,也可以将一个类的成员函数声明为友元函数。
1.2 定义
当一个类(例如 A)的某个成员函数被另一个类(例如 B)声明为友元函数时,这个函数可以访问 B 类的所有成员,包括私有和受保护成员。例子见下:
class B; // 前置声明
class A {
public:
void func(); // A 的成员函数
};
class B {
friend void A::func(); // 将 A 的成员函数 func 声明为 B 的友元函数
private:
int privateVar;
};
在这个例子中:
A 的成员函数 func 可以访问 B 的私有成员 privateVar。
此友元声明仅对 func 有效,而不是 A 类的其他成员函数。
1.3 友元成员函数特点
访问权限扩大:友元成员函数可以访问另一个类的所有成员(包括私有和受保护的成员)。
友元是单向关系:友元关系不是互相的。如果类 A 的某个成员函数是类 B 的友元,反过来 B 的成员函数并不会自动成为 A 的友元。
不能继承:友元关系不能被子类继承。即使类 A 的 func 是类 B 的友元,它的子类并不会因此自动拥有 B 的访问权限。
友元成员函数的作用域:友元关系仅限于指定的函数,而不是整个类。
二、实现
2.1 私有变量声明
在Building类中声明一个私有变量,见下:
2.2 跨类访问私有变量
告诉编译器 goodGay 类中的 visit 成员函数是 Building 的好朋友,可以访问私有内容,见下:
2.3 代码
上面各模块的完整代码见下:
#include <iostream>
#include <string>
using namespace std;
class Building; // 声明Building类,但未定义
class goodGay { // 声明goodGay类
public: // 将构造函数和成员函数设置为 public
goodGay(); // 构造函数声明
void visit(); // 只让 visit 函数作为 Building 的好朋友,可以访问 Building 中私有内容
void visit2(); // 声明visit2()函数,不是Building的友元
private:
Building* building; // goodGay类中私有成员,指向Building的指针
};
class Building { // 定义Building类
// 告诉编译器 goodGay 类中的 visit 成员函数是 Building 的好朋友,可以访问私有内容
friend void goodGay::visit();
public:
Building(); // 构造函数声明
public:
string m_sittingRoom; // 公有成员,表示客厅
private:
string m_BedRoom; // 私有成员,表示卧室
};
Building::Building() { // Building构造函数定义
this->m_sittingRoom = "客厅"; // 初始化客厅
this->m_BedRoom = "卧室"; // 初始化卧室
}
goodGay::goodGay() { // goodGay构造函数定义
building = new Building; // 动态创建Building对象,并赋值给指针
}
void goodGay::visit() { // goodGay::visit()函数定义,它是Building的友元
cout << "好基友正在访问 " << building->m_sittingRoom << endl; // 访问Building的公有成员
cout << "好基友正在访问 " << building->m_BedRoom << endl; // 访问Building的私有成员
}
void goodGay::visit2() { // goodGay::visit2()函数定义,它不是Building的友元
cout << "好基友正在访问 " << building->m_sittingRoom << endl; // 可以访问Building的公有成员
// cout << "好基友正在访问 " << building->m_BedRoom << endl; // 非友元函数,无法访问私有成 // 注释掉的代码,不能访问Building的私有成员
}
void test01() { // 测试函数test01()定义
goodGay gg; // 创建goodGay对象
gg.visit(); // 调用visit()函数
}
int main() {
test01(); // 调用测试函数
system("pause");
return 0;
}
2.4 输出
运行上面完整代码的输出见下:
三、总结
以上就是C++类和对象中成员函数作为友元函数的实例,上面代码中在类内写了函数声明,函数的定义放在了类外,希望能帮你理解。本人参考学习的是黑马程序员,仅作为笔记记录。
感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖
关注下面「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!