STL学习笔记(第二章 C++及其标准程序库简介)
本章重点是介绍与C++标准程序库相关的几个最重要的语言新特性
template(模板)
程序库中几乎所有东西都被设计成template形式。所谓templates,是针对“一个或多个尚未明确的型别”所撰写的函数或类别。
下面是一个典型例子
template<class T>
inline const T& max(const T& a,const T& b)
{
return a < b ? b : a;
{
template并非一次编译便产生出社和所有型别的代码,而是针对被使用的某个(或某组)型别进行编译。因此你必须先提供它的某个实作品才能调用。
Nontype Templates参数(非型别模板参数)
型别(type)可作为template参数,非型别(nontype)也可以作为template参数。例如可以把标准类别bitset<>的bits数量以template参数指定。下面定义两个由bits构成的容器,分别为32个bits空间和50个bits空间。
bitset<> flags32;
bitset<> flags50;
Default Template Parameters(缺省模板参数)
Template classes可以有缺省参数。例如以下声明,允许你使用一个或两个template参数来声明MyClass对象。
template <class T,class container = vector<T> >
class MyClass;
关键字typename
关键字typename被用来作为型别之前的标识符号。考虑下面例子:
template <class T>
class MyClass
{
typename T::SubType *ptr;
...
};
这里,typename指出SubType是class T中定义的一个型别,因此ptr是一个指向T::SubType型别的指针。
如果没有关键字typename,SubType会被当成一个static成员,于是T::SubType *ptr会被解释为型别T内的数值SubType与ptr的乘积。
typename还可以在template声明中用来替代关键字class:
template <typename T>
class MyClass;
Member Template(成员模板)
class member function可以是个template,但这样的member template既不能是virtual,也不能有缺省参数,例如:
class MyClass
{
...
template <class T>
void f(T);
};
这里的MyClass::f声明了一个成员函数集,使用任何型别参数。这个特性通常用来为template classes中的成员提供自动型别转换。
如果使用类模板,其型别必须和调用端所提供的对象的型别完全吻合:
template <class T>
class MyClass
{
private:
T value;
public:
void assign(const MyClass<T>& x) {value=x.value;}
...
}; void f()
{
MyClass<double> d;
MyClass<int> i;
d.assign(d) //OK
d.assign(i) //ERROR
}
而member template function可以放宽“必须精确吻合”这条规则。只要型别可被赋值,就可以被当做其函数参数。
template <class T>
class MyClass{
private:
T value;
public:
template <class X>
void assign(const MyClass<X>& x) {value=x.getValue();}
T getValue () const {return value;}
}; void f()
{
MyClass<double> d;
MyClass<int> i;
d.assign(d); //OK
d.assign(i); //OK
}
因为assign()参数x和*this的型别并不相同,所以不能直接存取MyClass<>的private成员和protected成员,因此要提供类似getValue()之类的东西。
template constructor是member template的一种特殊形式。template constructor并不遮蔽implicit copy constructor。如果型别完全吻合,implicit copy constructor就会被产生出来并被调用。
template <class T>
class MyClass{
public:
template <class U>
MyClass(const MyClass<U>& x);
...
}; void f()
{
MyClass<double> xd;
MyClass<double> xd2(xd) //calls built-in copy constructor
MyClass<int> xi(xd) //calls template constructor
}
基本型别的显示初始化(Explicit Initialization)
如果采用不含参数的、明确的constructor调用语法,基本型别会被初始化为零:
int i1; //undefined value
int i2=int(); //initialized with zero
这个特性可以确保我们在撰写template程序代码时,任何型别都有一个确切的初值:
template <class T>
void f()
{
T x=T();
...
}
关键字explicit
通过关键字explicit的作用,我们可以禁止“单参数构造函数”被用于自动型别转换。
class Stack{
explicit Stack(int size);
...
};
如果没有explicit,这个构造函数有能力将一个int自动转换成Stack。在这种情况下,可以给Stack指派一个整数值而不会引起任何问题:
Stack s;
...
s= //create a new Stack for 40 elements and assigns it to s
而使用了explicit的构造函数则会使上述赋值操作导致编译错误。
STL学习笔记(第二章 C++及其标准程序库简介)的更多相关文章
- 《DOM Scripting》学习笔记-——第二章 js语法
<Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...
- The Road to learn React书籍学习笔记(第二章)
The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...
- [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的“HT”
[HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的"HT" 敲黑板!!! 创建HTML超链接 <a>链接文本(此处会有下划线,可以单击 ...
- [HeadFirst-JSPServlet学习笔记][第二章:高层概述]
第二章:高层体系结构 容器 1 什么是容器? servelet没有main()方法.它们受控于另一个Java应用,这个Java应用称为容器(Container) Tomcat就是这样一个容器.Web服 ...
- c#高级编程第七版 学习笔记 第二章 核心c#
第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...
- 《Python基础教程(第二版)》学习笔记 -> 第二章 列表和元组
本章将引入一个新的概念:数据结构. 数据结构是通过某种方式阻止在一起的数据元素的集合,这些数据元素可以是数字或者字符,设置可以是其他数据结构. Python中,最基本的数据结构是序列(Sequence ...
- Java 学习笔记 ------第二章 从JDK到IDE
本章学习目标: 了解与设定PATH 了解与指定CLASSPATH 了解与指定SOURCEPATH 使用package与import管理类别 初步认识JDK与IDE的对应关系 一.第一个Java程序 工 ...
- 交换机安全学习笔记 第二章 MAC地址泛洪攻击
本文为书中相关知识的摘要,由于书中以思科设备为配置依据,所以笔记中补充了华为.H3C设备的相关配置.华为设备配置参考华为S2352EI 产品版本:V100R005C01文档版本:02. H3C配置参 ...
- 鸟哥linux私房菜学习笔记 第二章知识点
2.1 linux一切皆文件 2.2 磁盘分区 磁盘即文件 2.2.1 磁盘连接的方式与设备文件名的关系 模糊 1.正常的实体机器大概使用的都是 /dev/sd[a-] 的磁盘文件名,至于虚拟机环境下 ...
随机推荐
- MFC 实现打印机打印功能
Visual C++6.0是开发Windows应用程序的强大工具,但是要通过它实现程序的打印功能,一直是初学者的一个难点,经常有朋友询问如何在VC中实现打印功能,他们往往感到在MFC提供的框架内实现这 ...
- 设计模式-python实现
设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情 ...
- 写给小白看的 JavaScript 异步
某天突然写了个方法要从后台调用数据,显示在前台页面,但是输出结果总是空 undefined,得不到数据.多方找资料才发现,原来是入了 JS 异步的 “坑”. 我们常常听到单线程.多线程.同步.异步这些 ...
- 计蒜客 28315.Excellent Engineers-线段树(单点更新、区间最值) (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 E)
先写这几道题,比赛的时候有事就只签了个到. 题目传送门 E. Excellent Engineers 传送门 这个题的意思就是如果一个人的r1,r2,r3中的某一个比已存在的人中的小,就把这个人添加到 ...
- IDEA 提交项目至Git与获取Git项目
1.IDEA提交项目至git 注:保证已安装Git分布式管理系统,没有自行百度安装git 1)在IDEA中配置Git与GitHub a)Git: File-->Settings --> V ...
- request与response对象.
request与response对象. 1. request代表请求对象 response代表的响应对象. 学习它们我们可以操作http请求与响应. 2.request,response体系结构. 在 ...
- Python的网络编程[6] -> Modbus 协议 -> Modbus 的基本理论与 Python 实现
Modbus协议 / Modbus Protocol 目录 Modbus 协议简介 Modbus RTU协议 Modbus TCP协议与 Python 实现 Modbus 功能码 Modbus TCP ...
- mysql增加和删除字段
时间字段: `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `last_update_time` t ...
- OC语言基础之利用property优化封装
1.property功能用法 1: // @property:可以自动生成某个成员变量的setter和getter声明 2: @property int age;//可以直接免去变量的声明 3: // ...
- 细说JavaScript对象(3):hasOwnProperty
判断一个属性是定义在对象本身而不是继承自原型链,我们需要使用从 Object.prototype 继承而来的 hasOwnProperty 方法. hasOwnProperty 方法是 JavaScr ...