理解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的私有成员。