采用类的隐藏后实现了数据的隐藏和封装,类的数据成员一般定为私有成员,成员函数一般定义为共有的,以此提供类与外界的通信借口,有时需要定义一些函数,这些函数不是类的一部分(注意友原函数不是类的一部分),但又需要频繁的访问类的数据成员,这时可以将这些函数定义成友元函数。除了友元函数,还有友元类,友元的作用是提高了函数的运行效率(即类型检查和安全性检查都需要时间开销),但他破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
若在类中定义read()函数例如:
class Sales_data
{
public:
friend istream& read(istream &is,Sales_data &M);
string isbn();
int add (Sales_data trans);
void print ();
private:
string bookNo;
double price;
int units_sold;
{
public:
friend istream& read(istream &is,Sales_data &M);
string isbn();
int add (Sales_data trans);
void print ();
private:
string bookNo;
double price;
int units_sold;
};
则在调用中就必须用类的对象来引用这个函数,否则编译报错说函数未声明的使用,解决这个问题,就用到了friend关键字。将函数定义在外部,然后在类内部使用friend声明为友元函数,则可以正常使用。
友元函数的弊在于破坏了代码的封装性耦合性。
利处:普通函数直接访问类的成员,提高了运行效率,方便重载操作符的使用。
友元函数的弊在于破坏了代码的封装性耦合性。
利处:普通函数直接访问类的成员,提高了运行效率,方便重载操作符的使用。