大家好,欢迎来到IT知识分享网。
友元函数
在C++编程语言中,友元函数(Friend Function)是一种特殊的函数,具有访问类中私有成员的权限,尽管它不是类的成员函数。友元函数的存在使得类的设计更加灵活,能够在需要时授予外部函数访问类的私有成员的能力。本文将详细介绍C++中的友元函数,包括其定义、使用场景、优缺点以及示例。
一、定义
友元函数是在一个类中声明的一个非成员函数,但在类的内部声明该函数为友元。这意味着该函数可以访问该类的私有成员,包括私有变量和私有函数。友元函数的声明通常位于类的声明中,但其实现则位于类外部。
语法:
friend void friendFunction(const MyClass& obj);
案例:
#include <iostream> using namespace std; class MyClass {
private: int privateData; public: MyClass(int data) : privateData(data) {
} // 声明友元函数 friend void friendFunction(const MyClass& obj); // Getter函数 int getPrivateData() const {
return privateData; } }; // 友元函数实现 void friendFunction(const MyClass& obj) {
cout << "Friend function accessing private data: " << obj.privateData << endl; } int main() {
MyClass myObj(42); friendFunction(myObj); // 调用友元函数 cout << "Private data accessed via getter: " << myObj.getPrivateData() << endl; return 0; }
如果需要将普通函数声明为某个类的友元函数,只需要在该类中进行友元声明即可,不管public或private中进行声明都可以。
语法:
friend class FriendClass;
案例:
#include <iostream> using namespace std; class MyClass; class FriendClass {
public: void accessPrivateData(const MyClass& obj); }; class MyClass {
private: int privateData; public: MyClass(int data) : privateData(data) {
} // 声明友元类 friend class FriendClass; int getPrivateData() const {
return privateData; } }; // 友元类成员函数实现 void FriendClass::accessPrivateData(const MyClass& obj) {
cout << "Friend class accessing private data: " << obj.privateData << endl; } int main() {
MyClass myObj(42); FriendClass friendObj; friendObj.accessPrivateData(myObj); // 调用友元类的成员函数 return 0; }
语法:
friend int FriendMemberFunction(const MyClass& obj);
案例:
#include <iostream> using namespace std; class MyClass; // 声明友元成员函数 int FriendMemberFunction(const MyClass& obj); class MyClass {
private: int privateData; public: MyClass(int data) : privateData(data) {
} // 声明友元成员函数 friend int FriendMemberFunction(const MyClass& obj); int getPrivateData() const {
return privateData; } }; // 友元成员函数实现 int FriendMemberFunction(const MyClass& obj) {
return obj.privateData; } int main() {
MyClass myObj(42); int data = FriendMemberFunction(myObj); // 调用友元成员函数 cout << "Private data accessed via friend member function: " << data << endl; return 0; }
二、使用场景
1、访问私有成员:
主要作用是允许外部函数或类访问另一个类的私有成员,从而实现对类的细粒度控制。
2、操作符重载:
当需要重载类的操作符(如<<、>>、+、-等)时,友元函数可以访问私有成员,实现合适的操作。
3、提高效率:
在某些情况下,使用友元函数可以提高程序的执行效率,因为它可以直接访问类的私有成员,而不需要通过访问器函数(getter和setter)。
三、缺点
1、破坏封装性:
友元函数可以突破类的封装性,使得类的私有成员可以被外部函数直接访问,可能会降低代码的安全性和可维护性。(友元也破环了类的隐藏与封装,所以必须慎用 (牺牲安全,提高效率))
2、难以维护:
当程序变得复杂时,友元函数的使用可能会导致代码变得难以理解和维护。
友元不能 继承,交换,传递
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/128331.html