1. 分类

1.1 定义在类模板内的成员函数

被隐式声明为内联函数。

1.2. 类模板外部的成员函数,

类模板的成员函数本身是一个普通函数。但是,类模板的每个实例都有其自己版本的成员函数。因此,类模板的成员函数具有和模板相同的模板参数。因而,定义在类模板之外的成员函数就必须以关键字template开始,后接类模板参数列表。

在类外定义一个成员时,必须说明成员属于哪个类。从一个模板生成的类的名字中必须包含其模板实参。

2. 特性

当我们定义一一个成员函数时,模板实参与模板形参相同。

对于StrBlob的一个给定的成员函数
ret-type StrB1ob: :member-name(parm-ist)

对应的Blob的成员应该是这样的: .
template <typename T:ret-type Blob: : member-name(parm-list)

2.1 check和元素访问成员

template <typename T>
void Blob<T>: :check(size_ type i, const std: :string &msg) const
{if (i >= data->size())throw std: :out_ _of_ range (msg) ;
}

2.2 下标运算符和back函数用模板参数指出返回类型

template <typename T>T& Blob<T>: :back()
{check(0,"back on empty Blob") ;return data->back() ;
}
template <typename T> T& B1ob<T>: :operator[] (size_ type i)
{//如果i太大,check会抛出异常,阻止访问一个不存在的元素check(i, "subscript out of range") ;return (*data) [i];
}

在原StrBlob类中,这些运算符返回string&。而模板版本则返回一个引用,指向用来实例化Blob的类型。

2.3 Blob构造函数

构造函数的定义要以模板参数开始:

template <typename T> B1ob<T>: :Blob() : data (std: :make_ shared<std: :vector<T>>()){}

此构造函数分配-一个空vector,并将指向vector的指针保存在data中。如前所述,我们将类模板自己的类型参数作为vector的模板实参来分配vector。

类似的,接受一个initializer_ list参数的构造函数将其类型参数T作为initializer_ list参数的元素类型:

template <typename T> Blob<T>: :Blob(std: :initializer_ list<T> il) :data(std: :make_ shared<std: :vector<T>> (il) ) { }

类似默认构造函数,此构造函数分配一个新的vector。在本例中,我们用参数il来初始化此vector. 为了使用这个构造函数,我们必须传递给它一一个 initializer_ list, 其中的元素必须与Blob的元素类型兼容:

Blob<string> articles = {"a", "an", "the"};

这条语句中,构造函数的参数类型为initializer_ list. 列表中的每个字符串字面常量隐式地转换为一个 string。

C++ Primer 5th笔记(chap 16 模板和泛型编程) 类模板的成员函数相关推荐

  1. C++ Primer Plus 笔记(16章:string类和标准模板库)

    16 string类和标准模板库 16.1 string类 16.1.1 构造字符串 常见的字符串书中给了7个,另外还有两个在C++11里新增的(NTBS)表示以空字符结束的传统字符串 构造函数 描述 ...

  2. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板成员函数的实例化

    1. 默认情况下,一个类模板的成员函数只有当程序用到它时才进行实例化. (即使某种类型不能完全符合模板操作的要求(参见9.2节,第294页),我们仍然能用该类型实例化类todo). eg. //实例化 ...

  3. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义

    1. 定义 类似函数模板,类模板以关键字template开始,后跟模板参数列表.在类模板(及其成员)的定义中,我们将模板参数当作替身,代替使用模板时用户需要提供的类型或值: template < ...

  4. C++Primer Plus笔记——第十六章 string类和标准模板库总结及程序清单

    目录 本章小结 程序清单 string类 16.1 str1.cpp                16.2 strfile.cpp            16.3 hangman.cpp      ...

  5. c++模板---3(类模板碰到继承问题,类模板类外实现,类模板与友元函数)

    类模板碰到继承问题 基类如果是模板类,必须让子类告诉编译器 基类中的T到底是什么类型 如果不告诉,那么无法分配内存,编译不过 利用参数列表class Child :public Base<int ...

  6. C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)习题答案

    理论讲解请参考:C++ Primer 第五版 第7章类 7.1--类讲解(成员函数.非成员函数.构造函数) 目录 7.1 定义抽象数据类型习题答案 7.4&7.5 7.6&7.7 7. ...

  7. C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)

    习题答案请参考:C++ Primer 第五版 第7章类 7.1--类讲解(成员函数.非成员函数.构造函数)习题答案 目录 7.1 类讲解(成员函数.非成员函数.构造函数) 成员函数 this cons ...

  8. C++模板与泛型编程:模板特例化

    文章目录 模板特例化 定义函数模板特例化 函数重载与模板特例化 类模板特例化 类模板部分特例化 特例化成员而不是类 模板特例化 ​ 编写单一模板,使之对任何可能的模板实参都是最合适的,都能实例化,这并 ...

  9. C++中模板类中的成员函数以及模板函数在类外定义

    在C++中,类中的成员函数可以在类外完成定义,从而显得类中的成员函数看起来简洁明了.但是模板类里的成员函数和模板函数与普通的成员函数在类外定义不同. 先定义一个模板类以及成员函数和模板函数: 接下我们 ...

  10. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

最新文章

  1. 基于pytorch后量化(mnist分类)---浮点训练vs多bit后量化vs多bit量化感知训练效果对比
  2. 单元测试:基于Groovy的Spock框架
  3. 解决HierarchyViewer不能连接真机的问题
  4. array python 交集_python-数组之间的交集索引
  5. SpringBoot2.x整合Redis 分布式集群_02
  6. 编译安装python3.6_编译安装Python3.6及以上
  7. python自动压图贴图到Excel小工具
  8. 纯CSS3实现动态火车行驶特效
  9. c语言计算音频分贝函数,获取PCM音频数据的声音分贝值
  10. 计算机系统硬盘内存主频,内存时序和频率_内存硬盘-中关村在线
  11. 博客整理——K米测评
  12. php 只打印某个区域,PHP打印代码页面固定区域
  13. 洛谷P1251 餐巾计划问题 无汇源最小费用流
  14. RGB和HSV相互转换
  15. 宗镜录略讲——南怀瑾老师——系列1
  16. 设计模式读书笔记-----抽象工厂模式
  17. 西门子PLC 硬件标识符 (Hardware ID)基本应用
  18. matlab迭代实验总结,实验报告二
  19. 熟悉使用工具---第二次作业
  20. 带权重的随机数算法的实现

热门文章

  1. 后台开发技术--接入层设计
  2. Python list列表的使用(增删改查)
  3. JPA_登录校验Controller代码
  4. Android --- 使用纯java代码实现相对布局(通俗易懂)
  5. android remoteviews 设置背景,Android通过RemoteViews实现跨进程更新UI示例
  6. 电脑显示器变色_流光溢彩电竞出击:飞利浦猛腾M1系列电竞显示器275M1RZ
  7. java 700c corsa_JAVA CORSA休闲车,缔造“城市 生活 元素”
  8. 2020年度国家绿色数据中心名单正式发布
  9. 谷歌云服务宕机,苹果iCloud也不行了
  10. python django 表单_Django-表单处理