C++学习之友元类和友元函数
      模板类声明也可以有友元,模板的友元可以分为以下几类:
       1.非模板友元;
       2.约束模板友元,即就是友元的类型取决于类被实例化的时候的类型;
       3.非约束模板友元,即就是友元的所有具体化都是类的每一个具体化的友元。
一、非模板友元
       在我们编程的时候可以在模板类中声明一个友元函数,如下面所示:
       template<class T>
       class lei
       {
            friend void show();
       }
       上述声明使得show()函数成为模板中所有实例化的友元,每产生一个实例化,它都拥有show()这个友元函数,但他是友元函数,不是成员函数,我们该如何调用他们呢?他是如何访问类的对象的呢?这将有很多种方法,他可以访问全局对象,可以使用全局指针来访问非全局对象,可以创建自己的对象,可以访问独立于对象的末班类的静态数据成员。假设我们要为友元函数提供模板类参数,我们必须指明具体化。假如要为上面的show()函数提供模板类参数,可以这样做:
        template<class T>

       class lei
       {
            friend void show(lei <T> & );
       }
show()函数本身不是模板参数,而只是使用一个模板做参数,这意味着必须为要使用的友元定义显示具体化,例如:void show(lei <int> &);
二、模板类的约束模板友元函数
      我们可以修改上面的lei的定义,是的show()函数本身成为模板。具体的说,为约束模板友元做准备,要使类的每一个具体化都获得与友元匹配的具体化。这个相对前面复杂一点,他主要由三步组成:

首先,在类定义的前面声明每个函数模板;
templeate <typename T> void show();
然后在函数中再次将模板声明为友元;
    template<class TT>

       class lei
       {
            friend void show<TT>();
       }
最后就是要为友元提供模板定义。
三、模板类的非约束模板友元函数
       约束模板友元函数是在类外面声明的模板的具体化。int类具体化获得int函数具体化,以此类推。通过在类的内部声明模板,可以创建非约束友元函数,即就是每个函数具体化都是每个类具体化的友元。对于非约束友元,友元模板类型参数与模板类类型参数是不同的

C++学习之友元类和友元函数的更多相关文章

  1. C++友元(友元函数、友元类和友元成员函数)

    友元(友元函数.友元类和友元成员函数) C++ 有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私 ...

  2. c++ 友元类 与 友元类派生类

    定义: 当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问.我们就把类B叫做类A的友元. 用法: 在A类中加入: friend class B; 下面这个程序说明 ...

  3. C++的友元类和友元函数实例

    #include <math.h> #include<iostream> using namespace std; class Point { public: Point(do ...

  4. 友元(友元函数、友元类和友元成员函数) C++

    有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将 ...

  5. C++ 友元类,友元函数

    //友元函数 友元类 #include<iostream> using namespace std; class PointB { public: friend class PointC; ...

  6. c++,友元类和友元函数

    都是声明时友元的东西可以访问自己类的私有和保护成员 类的友元 友元是C++提供的一种破坏数据封装和数据隐藏的机制. 通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息 ...

  7. 初探swift语言的学习笔记四(类对象,函数)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  8. C++学习12 友元函数和友元类

    友元函数和友元类在实际开发中较少使用,想快速学习C++的读者可以跳过本节. 一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有 ...

  9. C++:友元(非成员友元函数、成员友元函数、友元类)

    3.8  友元:友元函数和友元类 友元函数 :既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,统称为友元函数.友元函数不是当前类的成员函数,而是独立于类的外部函数,但它可以访问该类所有的 ...

随机推荐

  1. js复制button在ie下的解决方式

    源代码例如以下: <input class="width200" maxlength="32" type="text" id=&quo ...

  2. collectionView关于点击事件

    -(void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)i ...

  3. sqlserver数据库 提纲

    sqlserver数据库一.体系结构文件--服务--界面 文件---.maf .ldf .ndf服务--MSSqlserver,别名(实例名)界面--宋庆龄serve如何windouws身份验证,如何 ...

  4. Gulp思维——Gulp高级技巧

    本文翻译自Getting gulpy -- Advanced tips for using gulp.js 感受过gulp.js带来的兴奋过后,你需要的不仅仅是它的光鲜,而是切切实实的实例.这篇文章讨 ...

  5. 《Microsoft SQL Server企业级平台管理实践》笔记

    - 页是 SQL Server 中数据存储的基本单位,大小为 8KB. - 区是空间管理的基本单位,8个物理上连续的页的集合(64KB). - 页的类型包括: 1. Data 2. Index 3. ...

  6. sql server 存储过程、事务,增删改

    CREATE procedure [dbo].[sp_TableSave] @TypeID tinyint, -- 0 新增,1 修改,2 删除 @ID int, ), ), ), @UID int, ...

  7. MySQL报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:NO)

    1.关闭mysql   # service mysqld stop2.屏蔽权限   # mysqld_safe --skip-grant-table   屏幕出现: Starting demo fro ...

  8. 移动并改变alpha

    <script type="text/javascript">function obj(x){return document.getElementById(x);}va ...

  9. enum枚举类型 的用法

    1.作为数组下标使用 enun  box{pencil, ruler}; void main() { string s[2]; s[pencil]="pencil"; s[rule ...

  10. C++学习笔录1

    1.在实际开发中,引用类型变量值用于函数的参数中.它不会另外开辟空间(提高了程序效率),他相当于变量的别名,代表的就是当前这个变量的地址空间.(引用的底层用的是指针.因此从底层的角度讲,其实它的效率是 ...