C++的友元函数和友元类

友元包括友元函数和又元类

友元函数

  • 在类外定义的函数,可以在在类内进行声明,但要在前面加上关键字friend,这样就构成了友元函数
  • 友元函数可以是不属于任何类的成员函数,也可以是其他类的成员函数
  • 友元函数可以访当前类中的所有成员(private、public、protected)
  • 友元函数会破坏面向对象的封装性,但是在某些频繁访问成员变量的地方可以提高性能

-------------------------------------------将两个点相加-----------------------------------------------------

class Point {
private:
	int m_x;
	int m_y;
public:

	Point(int x, int y) :m_x(x), m_y(y) { }
	void display() {
		cout << "(" << m_x << ", " << m_y << ")" << endl;
	}
	friend Point add(Point, Point);
};

Point add(Point p1, Point p2) {
	return Point(p1.m_x + p2.m_x, p1.m_y + p2.m_y);
}


int main() {

	Point p1(10, 10);
	p1.display();

	Point p2(20, 20);
	p2.display();

	Point p3 = add(p1, p2);
	p3.display();

	getchar();
	return 0;
}

运行结果

(10, 10)
(20, 20)
(30, 30)

说明:
1、友元函数的声明可以在类内的的任意位置
2、友元函数不是类的内部函数
3、友元函数的关系是单向的,并不能到过来
4、友元关系不能传递

友元类

跟友元函数一样,也可以将一个类声明为另一个类的友元类,这个友元类就可以访问当前类的所有成员了

-------------------------------------------计算两个点之间的距离-------------------------------------------

class Point {
private:
	int m_x,m_y;
public:
	Point(int x,int y):m_x(x),m_y(y){}
	void show(){
		printf("Point(%d,%d)\n",m_x,m_y);
	}
	friend class Line;
};

class Line {
private:
	Point p1,p2;
public:
	Line(Point& p1,Point& p2):p1(p1),p2(p2){}
	float distance(){
		return sqrt((p1.m_x-p2.m_x)*(p1.m_x-p2.m_x)+(p1.m_y-p2.m_y)*(p1.m_y-p2.m_y));
	}
};


int main(){

	Point p1(1,1);
	p1.show();
	
	Point p2(2,2);
	p2.show();
	
	Line line(p1,p2);
	printf("distance=%f\n",line.distance());
	
	return 0;
}

运行结果

Point(1,1)
Point(2,2)
distance=1.414214

猜你喜欢

转载自blog.csdn.net/qq_47329614/article/details/106927364