友元函数和友元类。
友元的定义:类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数称为它的友元(friend)。
但为什么有它,它有什么作用,能干什么,这些问题让我很困惑。通过查阅资料和思考,我了解到,首先要深刻认识到类是一种数据类型。在C语言中普通函数可以访问数据结构(struct)的成员变量,但是在C++的类中对于非public的成员变量普通函数无法访问,而有时直接访问调用这些非public的成员可以提高程序运行效率,所以就引入了友元(friend),这样友元函数把类当做一个数据结构,与之对应的对象传给友元函数,友元函数可以访问调用这个类的非public的成员变量。
对于友元类,需要注意在友元类前进行访问类的前置声明。A类声明为B类的友元类后,B类就可以访问A类的私有成员,这有什么用呢?还是回到类是一种数据类型这句话,在C语言中对于数据结构(struct)它的成员也可以是某个数据结构(struct),那么在C++中类的成员也可以是某个类的对象,即B类中可以有A类的对象,如果没有友元机制,B类将不能访问A类的非public的成员,这显然是不合理的,所以引入了友元机制就B类就可以访问A类对象的非public的成员。
#include<iostream>
using namespace std;
class Circle;
class Point
{
public:
Point();
Point(float a,float b);
friend class Circle;
friend const Point middle (const Point& u,const Point& v);
void print() const;
private:
float x;
float y;
};
Point::Point():x(0.0),y(0.0){}
Point::Point(float a,float b):x(a),y(b)
{
//do nothing;
}
void Point::print()const
{
cout<<"x:"<<x<<" y:"<<y<<endl;
}
const Point middle(const Point& u,const Point& v)
{
return Point((u.x+v.x)/2.0,(u.y+v.y)/2.0);
}
class Circle
{
public:
Circle();
Circle &move(float a,float b);
void print()const;
private:
float radius;
Point center;
};
Circle::Circle():radius(0.0)
{
center.x=0.0;
center.y=0.0;
}
Circle& Circle::move(float a,float b)
{
center.x +=a;
center.y +=b;
return *this;
}
void Circle::print()const
{
center.print();
cout<<"radius:"<<radius<<endl;
}
int main()
{
Point p1(1.0,2.0);
Point p2(3.0,4.0);
p1.print();
p2.print();
cout<<"两个点的中点:";
middle(p1,p2).print();
Circle c;
c.print();
cout<<"移动圆心:";
c.move(10.0,10.0);
c.print();
return 0;
}