Chinaunix首页 | 论坛 | 博客
  • 博客访问: 226211
  • 博文数量: 56
  • 博客积分: 2325
  • 博客等级: 大尉
  • 技术积分: 560
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-30 18:18
文章存档

2012年(7)

2011年(1)

2010年(2)

2009年(46)

我的朋友

分类: C/C++

2009-05-16 12:50:21

1.友元的作用

    当某个类或者函数被授予友元关系时,该类或函数获得了对授予者(类)的私有成员的访问权。因为友元不是授予者的成员,故其不受其声明出现部分的访问控制的影响。

提示:将友元声明放在类的开始或者结尾是个好主意

class Screen {

friend class X;

friend X& X::add(X::x, X::y, Screen &);

 }

2.友元声明与作用域

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

    上例中,类X需先定义,否则screen不能将add定义为友元。一般来说,必须先定义类,才可以将类的成员函数设为友元。但,不必先声明类和非成员函数,就可将之设为友元。

    class A{

     friend class B;

     friend void f(); 

    }

    class C{

     B *y;

     void c(){f()};

    }

   友元声明将类和非成员函数引入到外围作用域。友元函数可在类内部定义,作用域扩展至包围该类定义的作用域。

3. 重载与友元

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

4.友元与继承

   友元不可继承,基类的友元对派生类没有特殊访问权限;

   若基类被授予友元,其派生类没有对授予者的特殊访问权限。

5.类模板的友元声明

   第一种:模板类授予普通函数或类友元关系;

   template class Bar

   { friend class net;

     friend void netBar();

   }

   第二种:模板类授予模板函数或模板类友元关系,友元的所有实例都有对被授予者所有实例的特殊访问权。

   template class Bar

   {

     template friend class net;

     template friend void netBar(const Type &);

   }

   net所有实例可以访问Bar的所有实例;netBar亦同。

    第三种:模板类授予模板函数或模板类的部分实例友元关系。

  template friend class net;

  template friend void netBar(const Type &);

   template class Bar

   {

     template friend class net;

     template friend void netBar(const T&);

   }

   Bar bar; //net netBar是友元;net 不是友元;

  注意:对于第一、二种,不须对模板类和函数进行声明。编译器将友元声明当做声明对待。但在第三种中,必须在友元声明前生明前声明模板类和函数。如果不提前声明,编译器将之看做普通的类或函数。

阅读(2650) | 评论(0) | 转发(0) |
0

上一篇:c++中的数组形参

下一篇:c++中的const

给主人留下些什么吧!~~