C++学习笔记(2)----类模板和友元
当一个类包含一个友元声明时,类与友元各自是否是模板是相互无关的。如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例。如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定实例。
1. 一对一友好关系
类模板与另一个(类或函数)模板间友好关系的最常见形式是建立对应实例及其友元间的友好关系。例如,我们的 Blob 类应该讲 BlobPtr 类和一个模板版本的 Blob 相等运算符定义为友元。
为了引用(类或函数) 模板的一个特定实例,我们必须首先声明模板自身。一个模板声明包括模板参数列表:
//前置声明,在 Blob 中声明友元所需要的
template <typename> class BlobPtr;
template <typename> class Blob; //运算符==中的参数所需要的
template <typename T>
bool operator == (const Blob<T>&, const Blob<T>&); template <typename T>
class Blob {
//每个Blob实例将访问权限授予用相同类型实例化的BlobPtr和相等运算符
friend class BlobPtr<T>;
friend bool operator ==<T> (const Blob<T>&, const Blob<T>&);
};
我们首先将Blob、BlobPtr和Operator== 声明为模板。这些声明时 operator==函数的参数声明以及 Blob 中的友元声明所需要的。
友元的声明用 Blob 的模板形参作为它们自己的模板形参。因此,友好关系被限定在用相同类型实例化的 Blob 与 BlobPtr 相等运算符之间:
Blob<char> ca; //BlobPtr<char>和 operator==<char>都是本对象的友元
Blob<int> ia; //BlobPtr<int>和 operator==<int>都是本对象的友元
BlobPtr<char>的成员可以访问 ca (或任何其他 Blob<char>对象)的非 Public 部分,但 ca 对 ia (或任何其他 Blob<int> 对象) 或 Blob 的任何其他实例都没有特殊访问权。
2. 通用和特定的模板友好声明
//前置声明,在将模板的一个特定实例声明为友元时要用到
template<typename T> class Pal; class C { //C 是一个普通的非模板类
friend class Pal<C>; //用类C 实例化的Pal是C 的一个友元
template <typename T> friend class Pal2; //Pal2 的所有实例都是C 的友元;这种情况无须前置声明
}; template <typename T> class C2 {//C2 本身是一个模板类
// C2 的每个实例将相同实例化的 Pal 声明为友元
friend class Pal<T>; // Pal 的模板声明必须在作用域内 // Pal2 的所有实例都是 C2 的每个实例的友元,不需要前置声明
template <typename X> friend class Pal2; // Pal3 是一个模板类,它是 C2 所有实例的友元
friend class Pal3; //不需要 Pal3 的前置声明
};
为了让所有实例成为友元,友元声明中必须使用与模板本身不同的模板参数。
C++学习笔记(2)----类模板和友元的更多相关文章
- C++学习笔记36:类模板
类模板的目的 设计通用的类型式,以适应广泛的成员数据型式 类模板的定义格式 template<模板形式参数列表>class 类名称{...}; 原型:template<typenam ...
- C++学习笔记(3)----类模板的static成员
与任何其他类相同,类模板可以声明 static 成员: template <typename T> class Foo { public: static std::size_t count ...
- C++ Primer 学习笔记_53_类和数据抽象 --友元、static员
分类 --友元.static成员 一.友元 友元机制同意一个类将对其.友元关系:一个样例 如果一个窗体管理类Window_Mgr可能须要訪问由其管理的Screen对象的内部数据.Screen应该同意其 ...
- Java学习笔记之---类和对象
Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态 例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...
- Java学习笔记——File类之文件管理和读写操作、下载图片
Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...
- python学习笔记4_类和更抽象
python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...
- 微信小程序开发:学习笔记[2]——WXML模板
微信小程序开发:学习笔记[2]——WXML模板 快速开始 介绍 WXML 全称是 WeiXin Markup Language,是小程序框架设计的一套标签语言,结合小程序的基础组件.事件系统,可以构建 ...
- UML学习笔记:类图
UML学习笔记:类图 有些问题,不去解决,就永远都是问题! 类图 类图(Class Diagrame)是描述类.接口以及它们之间关系的图,用来显示系统中各个类的静态结构. 类图包含2种元素:类.接口, ...
- c++类模板之友元函数
前言:自从开始学模板了后,小编在练习的过程中.常常一编译之后出现几十个错误,而且还是那种看都看不懂那种(此刻只想一句MMP).于是写了便写了类模板友元函数的用法这篇博客.来记录一下自己的学习. 普通友 ...
随机推荐
- 【面向对象】【prototype&&__proto__&&实例化对象三者之间的关系】
1.构造函数 a.什么是构造函数? 解释:通过关键字new 创建的函数叫做构造函数 作用:用来创建一个对象 废话少说直接上代码,首先我们还是创建一个构造函数人类 然后我们在创建两个实例,一个凡尘 一个 ...
- 直接线性变换解法(DLT)用于标定相机
直接线性变换法是建立像点坐标和相应物点物方空间坐标之间直接的线性关系的算法.特点:不需要内外方位元素:适合于非量测相机:满足中.低精度的测量任务:可以标定单个相机. 1 各坐标系之间的关系推导直接线性 ...
- 通过源码看原理之 selenium
# selenium的历史1. selenium1.x:这个时候的selenium,使用的是JavaScript注入技术与浏览器打交道,需要Selenium RC启动一个Server,将操作Web元素 ...
- [转] Java中Comparator进行对象排序
[From] https://blog.51cto.com/thinklili/2063244 Java在8后引入了lambda表达式和流,使得排序方法有了变化 class User { int id ...
- 布局优化之ViewStub、Include、merge使用分析
布局技巧 在Android开发过程中,我们会遇到很多的问题,随着UI界面越来越多,布局的重复性.复杂度也随之增加,所幸的是,Android官方也给出了几个对布局进行优化的方法,下面根据自己的理解对官方 ...
- Mac 10.12搭建OpenVPN服务器以及客户端的使用
说明:我未实践,大概就是这几个步骤,建议服务器在Linux下搭建效果会更好. 1.用brew下载openvpn brew install openvpn 2.命令行输入 openvpn --versi ...
- (转)如何在CentOS / RHEL 7上安装Elasticsearch,Logstash和Kibana(ELK)
原文:https://www.howtoing.com/install-elasticsearch-logstash-and-kibana-elk-stack-on-centos-rhel-7 如果你 ...
- 第十篇--------javascript函数-参数
javascript函数的参数:形参,实参 //function 参数 //形参列表 function test(a,b,c,d){ //alert(test.length); //形参个数,4个 / ...
- git 检出项目部分目录(稀疏检出)
git clone 会把整个项目都clone下来,对于大项目git status比较慢,每次pull时候也拉取一些无关的代码或者文件:git可以实现像svn一样检出部分目录 步骤: git clone ...
- 使用Thumbnailator处理gif图片时遇到java.lang.ArrayIndexOutOfBoundsException: 4096异常处理
环境 1.7.0_80 在使用Thumbnailator处理gif图片时,遇到问题: Exception in thread "main" java.lang.ArrayIndex ...