C++友元类和友元函数思考

友元函数和友元类。

友元的定义:类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数称为它的友元(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;
}







 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值