背景介绍
由于类内部的私有成员和保护成员只能在类定义的范围内使用,即外部只能通过成员函数访问。这会造成较大的时间和空间的开销。
c++提供了友元,他有权访问类的所有私有(private)成员和保护(protected)成员
关键字:friend
分类:友元函数、友元类
注意:友元不具有交换性和传递性
友元函数
特点
在类中声明友元函数时,需要在其函数名前加上关键字friend。
声明可以放在任何位置。因为友元函数可以不属于public、private、protected。
友元函数可以定义在类的内部,也可以定义在类的外部
友元函数不是类的成员函数,所以没有this指针,必须通过参数传递对象或对象指针来引用该对象的成员
友元函数不是当前类的成员函数,但它可以访问该类的所有成员,包括私有成员、保护成员和公有成员。
分类
友元函数既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数。
1.友元函数不属于任何类(普通全局函数)
1) 友元不是成员函数,所以不用使用::
2) 友元不是类的成员,所以它不能直接访问对象的数据成员,也不能通过this指针访问对象是数据成员。它必须通过作为入口参数传递进来的对象名来访问数据成员
3) 普通的成员函数只能访问所属类,但是多个类的友元可以访问所有类的数据
class MyClass { public: friend void myFriendFunction(MyClass& obj); // 声明函数myFriendFunction为MyClass的友元 private: int myPrivateValue; }; void myFriendFunction(MyClass& obj) { cout << obj.myPrivateValue << endl; // 访问MyClass的私有成员 }
2.友元函数是另一个类的成员函数
1) 友元成员函数不仅可以访问自己所在类对象中的私有成员和公有成员,还可以访问friend声明语句所在类对象中的所有成员。
2) 作用:使两个类相互合作、协调工作,完成某一任务。
3) 当一个类的成员函数作为另一个类的友元函数时,必须先定义这个类。并且需要加上类名::
class ClassB; //前置声明 class ClassA { public: void callB(ClassB& obj); //ClassA的成员函数 }; class ClassB { private: int privateVar = 10; friend void ClassA::callB(ClassB& obj); //声明友元函数 }; void ClassA::callB(ClassB& obj) { //定义友元函数 std::cout << "Accessing private variable of ClassB: " << obj.privateVar << std::endl; } int main() { ClassA a; ClassB b; a.callB(b); return 0; }
友元类
将一个类声明为另一个类的友元
形式:friend class xxx
当一个类被说明为另一个类的友元类时,它所有的成员函数都成为另一个类的友元函数,这就意味着作为友元类中的所有成员函数都可以访问另一个类中的所有成员。
class ClassA { private: int a; public: ClassA(int num):a(num){} friend class ClassB; //ClassB是ClassA的友元类 }; class ClassB { public: void printA(ClassA& obj) { std::cout << "The private member of ClassA accessed by ClassB is: " << obj.a << std::endl; } }; int main() { ClassA a(100); ClassB b; b.printA(a); //输出结果:The private member of ClassA accessed by ClassB is: 100 return 0; }