C++ 友元类和友元函数

it2025-07-31  10

1.作用和应用场景

作用:我们知道类的私有属性只能在类的内部访问, 能不能通过一种途径可以在类的外部访问? 答案是有的,友元函数。 应用场景:主要的应用场景是在一些C++已经定义好的类里面,你无法访问类,不能在类里面实现,只能在外部实现的时候,只能用友元函数。

2.友元函数

a. 友元函数的作用: 可以在类的外部访问类的私有属性,但是会破坏类的封装。 b. 友元函数的格式: friend 函数返回类型 函数名(参数列表)。 c. 友元函数声明的位置和类访问修饰符无关。

//对象的成员必须初始化 class Test { //声明,该函数是Test的友元函数,可以在类的外部访问类的私有成员 friend void func(Test& x); private: int a; public: Test() { a = 5; } void getA() { cout<<a<<endl; }; }; //友元函数的实现 void func(Test& x) { //类的外部修改私有成员变量 x.a =10 ; } int main() { Test a; //对象作为实参,必须初始化(手动写构造函数)。(不是C++编译器默认) func(a); a.getA(); return 0; }

3.友元类

a. 若B类是A类的友元类,则B类的所有函数都是A类的友元函数。 b. B类通常作为设计一种对数据操作或类之间传递信息的辅助类。

class A { // leaf 声明了B是自己的好朋友,这样B就可以直接修改自己的私有属性 //类B是类A的友元类,类B的所有成员函数都是类A的友元函数 friend class B; private: int x; public: A() { x = 10; cout << "A被创造" << endl; } ~A() { cout << "A被析构" << endl; } }; class B { private: A a; public: int getX() { return a.x; //直接访问a的私有属性 } B() { cout << "B被创造" << endl; } ~B() { cout << "B被析构" << endl; } }; int main() { //1.验证了类B是类A的友元类, 类B的所有成员函数是类A的友元函数 //2.对于这种组合对象的构造函数的调用顺序记住:先构造的对象后被释放 B b; cout<<b.getX()<<endl; return 0; }

构造函数和析构函数的执行顺序:

最新回复(0)