【C++】class的设计与使用(七)友元函数、友元类(关键字friend)

friend

  • 任何class都可以将其他类或者函数指定为朋友(friend);
  • friend具备了与类成员函数相同的访问权限,可以访问类的private member;
  • 声明:只需要在函数原型前加上关键字friend
  • 这份声明可以出现在class定义的任意位置上,不受private和public的影响;
  • 想要将数个重载函数声明为某个类的friend,所有的重载函数前都要加friend;
//operator*()这个非成员函数在两个类里声明为friend
//它可以直接访问Triangular类和Triangular_iterator类的私有成员
//如下
class Triangular{
	friend int operator*(const Triangular_iterator &rhs);
	//...
};
class Triangular_iterator{
	friend int operator*(const Triangular_iterator &rhs);
	//...
};

class Triangular{
	friend int Triangular_iterator::operator*();
	//...
};
  • 类与类之间也可以建立friend关系,借此A类里的所有成员函数都成为了B类的friend,反之同理;
    以这种形式来声明类之间的friend,就不需要在friend声明之前先显现class的定义了。
class Triangular{
	friend class Triangular_iterator;
	//...
};

注意无需建立友谊的情况:

class Triangular{
public:
	static int elem_size(){return _elems.size();}
	static int max_elems(){return _max_elems;}
	//...
};
//以上类定义了public里的成员函数,用到了以下类的成员函数的定义里
//友谊不再必要
//即无需friend void Triangular_iterator::check_integrity();
inline void Triangular_iterator::check_integrity()
{
	if(_index>=Triangular::max_elems())
	{
		throw iterator_overflow();
	}
	if(_index>=Triangular::elems_size())
	{
		Triangular::gen_elements(_index + 1);
	}
}

友谊的建立,通常是为了效率考虑的。比如只希望进行某个数据成员的读取和写入,那么为他提供具有public访问权限的inline函数,就是建立友谊的另一个替代方案。

你可能感兴趣的:(C++基础,c++,开发语言,笔记)