友元
友元分为友元函数和友元类,友元提供了一种突破类域封装的方式,提供了便利,但是也增加了耦合度,因此友元应该避免多用。
友元函数
友元函数可以直接访问类的私有成员函数,它是在了类外定义的普通成员函数,不属于任何类,但是需要在类的内部进行声明,同时要在前面加上friend关键字进行修饰。
// 重载输入输出操作符实现成员函数a、b、c的输入和输出
class Test{
// 友元函数的声明
friend ostream& operator << (ostream& out,const Test& t1);
friend istream& operator >> (istream& in,Test& t1);
public:
Test(int a,int b,int c):_a(a),_b(b),_c(c){}
private:
int _a;
int _b;
int _c;
};
// 这里的返回值是为了保证有连续的输入输出操作。
ostream& operator << (ostream& out,const Test& t1){
cout << t1._a << t1._b << t1._c << endl;
return out;
}
istream& operator >> (istream& in,Test& t1){
cin >> t1._a >> t2._b >> t3._c;
return in;
}
友元函数的说明
- 友元函数可以访问类的私有成员和保护成员,但是不是类的成员函数;
- 友元函数不能用const进行修饰;(类中用const修饰类的成员函数主要是为了保证该对象不会改变类的一些成员变量,而友元函数根本就不属于类的成员函数,因此用const修饰没有意义)。还可以这样理解,因为const在这里本质上修饰成员函数中隐含的this指针,保证通过this指针不会修改类中的成员变量,但是类的非成员函数是没有隐含的this指针的,这样没有意义。
- 友元函数可以在类定义的任何地方声明,不受访问限定符的约束;
- 一个函数可以是多个类的友元函数;
- 友元函数的调用与普通函数的调用原理相同。
友元类
友元类中的所有成员函数都可以是另一个类中的友元函数,都可以访问另一个类中全部成员。
class Test1{
// 声明Test2是Test1的友元类。
friend class Test2;
public:
Test1(int a):_a(a){}
private:
int _a;
};
class Test2{
public:
// Test2中可以直接访问Test1中的私有成员变量
void Test2(Test1& t1){
cout << t1._a << endl;
}
}
友元类的说明:
- 友元关系是单向的,不具有交换性
- 友元关系不能传递

浙公网安备 33010602011771号