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;
}
构造函数和析构函数的执行顺序: