C++小课堂——friend友元
文章目录
- 1. 友元函数
- 2. 友元类
- 3. 友元成员函数
- 友元关系不存在传递性
- 友元小结
在C++中,
friend
关键字用于声明友元(friend)。友元是一种机制,允许某个函数(可以是其它类的成员函数,或者是某个外部函数)或类访问另一个类的私有成员。friend
关键字可以用于函数、类、或整个类的成员函数。
一般来说,最好在类定义开始或结束前的位置集中声明友元。
1. 友元函数
class MyClass {
private:
int privateMember;
public:
MyClass(int value) : privateMember(value) {}
// 声明友元函数
friend void friendFunction(const MyClass& obj);
};
// 定义友元函数,可以访问私有成员
void friendFunction(const MyClass& obj) {
std::cout << "Friend Function: " << obj.privateMember << std::endl;
}
int main() {
MyClass obj(42);
// 调用友元函数
friendFunction(obj);
return 0;
}
在这个例子中,friendFunction
被声明为 MyClass
的友元函数,因此它可以访问 MyClass
的私有成员 privateMember
。
2. 友元类
class MyClass {
private:
int privateMember;
public:
MyClass(int value) : privateMember(value) {}
// 声明友元类
friend class FriendClass;
};
// 友元类可以访问私有成员
class FriendClass {
public:
void accessPrivateMember(const MyClass& obj) {
std::cout << "FriendClass accessing private member: " << obj.privateMember << std::endl;
}
};
int main() {
MyClass obj(42);
// 创建友元类的对象
FriendClass friendObj;
// 调用友元类的函数,访问私有成员
friendObj.accessPrivateMember(obj);
return 0;
}
在这个例子中,FriendClass
被声明为 MyClass
的友元类,因此它可以访问 MyClass
的私有成员。
如果一个类指定了友元类,则友元类的成员函数可以访问此类包括非公有成员在内的所有成员。
3. 友元成员函数
class MyClass {
private:
int privateMember;
public:
MyClass(int value) : privateMember(value) {}
// 声明友元成员函数
friend void FriendFunction(const MyClass& obj);
};
// 定义友元成员函数,可以访问私有成员
void FriendFunction(const MyClass& obj) {
std::cout << "Friend Function: " << obj.privateMember << std::endl;
}
int main() {
MyClass obj(42);
// 调用友元成员函数
FriendFunction(obj);
return 0;
}
这个例子中,FriendFunction
被声明为 MyClass
的友元成员函数,允许它访问 MyClass
的私有成员。
友元关系不存在传递性
必须要注意的一点是,友元关系不存在传递性。也就是说,每个类负责控制自己的友元类或友元函数。(朋友的朋友不是我的朋友)
友元小结
- 友元关系不能被继承(爸爸的朋友不一定是儿子的朋友)。
- 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
- 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的声明。
使用友元机制需要注意,因为它打破了封装性,可能导致代码的耦合性增加。因此,在使用友元时应慎重考虑设计。友元的设计可以在某些情况下提供更灵活的访问权限,但通常应当优先考虑良好的封装性。
原文地址:https://blog.csdn.net/New_Teen/article/details/146190197
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/585738.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/585738.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!