C++第三次作业

类的友元

友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。在一个类中,可以利用关键字friend将其他函数或类声明为友元。如果友元是一般函数或类的成员函数,称为友元函数;如果友元是一个类,则称为友元类,友元类的所有成员函数都自动成为友元函数。

一、友元函数

友元函数是在类中用关键字friend修饰的非成员函数。友元函数可以是一个普通的函数,也可以是其他类的成员函数,但是在它的函数体中可以通过对象名访问类的私有和保护成员。友元函数可以访问类中的私有成员和其他数据,但是不能直接访问,需通过对象。
语法形式:

friend + 函数声明

1.通过友元函数为普通函数的函数对类的数据成员进行访问

#include<iostream>
#include<cmath>
using namespace std;
class A {
public:
	friend class B;         // B类是A类的友元
	A(int x=0):x(x){}      //类A的构造函数
	int getX (){ return x; }
	friend void set(A&a);  //
private:
	int x;
};
void  set(A&a) {
	int x2;
	cout << "input x2:" << endl;
	cin >> x2;
		a.x = x2;      //普通友元函数访问类A的数据成员
	}
void main() {
	int x1;
	cout << "input x1:" << endl;
	cin >> x1;
	A a(x1);
	cout <<"before a.x="<< a.getX() << endl<<endl;
	set(a);
	cout <<"then a.x="<< a.getX() << endl;
	system("pause");

}

效果:
图片15.jpg


##二、友元类 同友元函数一样,一个类可以将另一个类声明为友元类。若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。 语法形式: ``` class B{ ... //B类的成员声明 friend class A; //声明A为B的友元类 ... }; ``` ###2.通过友元类中的成员函数对原类的数据成员进行访问 ``` #include #include using namespace std; class A { public: friend class B; // B类是A类的友元 A(int x=0):x(x){} //类A的构造函数 int getX (){ return x; } private: int x; }; class B { public: B(int x1=0):x1(x1){} //类B的构造函数 void set(A&a); //B的成员函数的声明 private: int x1; }; void B:: set(A&a) { int x2; cout << "input x2:" << endl; cin >> x2; a.x = x2; //B是A的友元类,B的成员函数访问A的数据成员 } void main() { int x1; cout << "input x1:" << endl; cin >> x1; A a(x1); cout <<"before a.x="<< a.getX() << endl<}

效果:
![图片14_1_.jpg](https://i.loli.net/2019/09/29/vhdmSnUOHti7ZpI.jpg)
<hr>

##三、友元关系易错点
1.友元关系是不能传递的。
B类是A类的友元,C类是B类的友元,C类和A类之间如果没有声明,就没有任何友元关系,不能进行数据共享。
2.友元关系是单向的。
如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有、保护数据。
3.友元关系是不被继承的
<hr>
#四、总结与反思
通过友元关系一个普通函数或者类的成员函数可以访问封装于另一个类中的数据。从一定程度上讲友元是对数据隐藏和封装的破坏。为了数据共享,提高程序的效率和可读性,很多情况下这种小的破坏是必要的,要在共享和封装之间找到一个恰当的平衡。
posted @ 2019-09-29 17:03  tao4867  阅读(170)  评论(0编辑  收藏  举报