您的位置:首页 > 编程语言 > C语言/C++

C++ 12.5 友元

2015-06-23 16:08 323 查看

简介

===================================================================================================

在某些情况下,允许特定的非成员函数访问一个类的私有成员,同时任然阻止一般的访问。友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。

但是一个类将对其非公有成员的访问授予其他函数或类,会破坏类的封装性,降低类的可靠性和可维护性

友元的声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以他们不受其声明出现部分的访问控制影响。

通常,将友元声明成组地放在类定义的开始或结尾。

class Screen{
public:
   typedef std::string::size_type index;
private:
   std::string contents;
   index cursor;
   index height,width;//用同义词替换
};


1、友元关系

友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。将一个类设为友元,友元类的所有成员函数都可以访问授予友元关系的那个类的非公有成员。

class Screen{
friend class Window_Mgr;
};
//Window_Mgr的成员可以直接引用Screen的私有成员。


//Window_Mgr的成员可以直接引用Screen的私有成员。
//函数返回类型是Window_Mgr 的引用,函数名是relocate,因为在类外定义,所以前面加上类作用域
Window_Mgr &
//因为这里用的形参类型index是Screen类里面定义的,所以要加上Screen::作用域,如果是Window_Mgr类就不用加了
//具体的作用域看《12.3 类的作用域名》
Window_Mgr::relocate(Screen::index r,Screen::index c,Screen& s){
    s.height +=r;
    s.widtn+=c;
    return *this;//这里返回什么
}
//缺少友元声明时,这段代码将会出错:将不允许使用形参s的height和width成员。


2、使其他类的成员函数成为友元

当我们将成员函数声明为友元时,函数名必须用该函数所属的类名字加以限定。

class Screen{

  friend Window_Mgr&
      Window_Mgr::relocate(Window_Mgr::index,Window_Mgr::index,Screen&);
};


3、友元声明与作用域

为了正确地构造函数,需要注意友元声明与友元定义之间的互相依赖。

在前面的例子中,类Window_Mgr必须先定义。否则,Screen类就不能将一个Window_Mgr函数指定为友元。然而,只有定义类Screen之后,才能定义relocate函数—–毕竟,他被设为友元是为了访问类Screen的成员。

-必须先定义包含成员函数的类,才能将成员函数设为友元。另一方面,不必先声明类和非成员函数来将他们设为友元。

-友元声明将已命名的类或非成员函数引入到外围作用域中。此外,友元函数可以在类的内部定义,该函数的作用域扩展到包围该类定义的作用域。

//没怎么懂!!!!
//用友元引入的类名和函数(定义或声明),可以像预先声明的一样使用
class X{
   friend class Y;
   friend void f(){};
};
class Z{
   Y *ymem;
   void g(){return::f();};
};


4、重载函数与友元关系

类必须将重载函数集中每一个希望设为友元的函数都声明为友元:

//函数名是storeOn,函数返回类型是ostream&--输出对象的引用,使用命名空间std
extern std::ostream& storeOn(std::ostream &,Screen &);
extern BitMap& storeOn(BitMap &,Screen &);
class Screen{
  friend std::ostream& storeOn(std::ostream &,Screen &);
  //类Screen将接受一个ostream&的storeOn版本设为自己的友元。
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: