本章重点是介绍与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++及其标准程序库简介)的更多相关文章

  1. 《DOM Scripting》学习笔记-——第二章 js语法

    <Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...

  2. The Road to learn React书籍学习笔记(第二章)

    The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...

  3. [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的“HT”

    [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的"HT" 敲黑板!!! 创建HTML超链接 <a>链接文本(此处会有下划线,可以单击 ...

  4. [HeadFirst-JSPServlet学习笔记][第二章:高层概述]

    第二章:高层体系结构 容器 1 什么是容器? servelet没有main()方法.它们受控于另一个Java应用,这个Java应用称为容器(Container) Tomcat就是这样一个容器.Web服 ...

  5. c#高级编程第七版 学习笔记 第二章 核心c#

    第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...

  6. 《Python基础教程(第二版)》学习笔记 -> 第二章 列表和元组

    本章将引入一个新的概念:数据结构. 数据结构是通过某种方式阻止在一起的数据元素的集合,这些数据元素可以是数字或者字符,设置可以是其他数据结构. Python中,最基本的数据结构是序列(Sequence ...

  7. Java 学习笔记 ------第二章 从JDK到IDE

    本章学习目标: 了解与设定PATH 了解与指定CLASSPATH 了解与指定SOURCEPATH 使用package与import管理类别 初步认识JDK与IDE的对应关系 一.第一个Java程序 工 ...

  8. 交换机安全学习笔记 第二章 MAC地址泛洪攻击

    本文为书中相关知识的摘要,由于书中以思科设备为配置依据,所以笔记中补充了华为.H3C设备的相关配置.华为设备配置参考华为S2352EI 产品版本:V100R005C01文档版本:02.  H3C配置参 ...

  9. 鸟哥linux私房菜学习笔记 第二章知识点

    2.1 linux一切皆文件 2.2 磁盘分区 磁盘即文件 2.2.1 磁盘连接的方式与设备文件名的关系 模糊 1.正常的实体机器大概使用的都是 /dev/sd[a-] 的磁盘文件名,至于虚拟机环境下 ...

随机推荐

  1. ajax验证前端页面

    1.html页面 用ajax验证表单的时候不需要form标签,并把提交按钮由type=“submit ”改为type=“button” 数据表结构 ajax.html <!DOCTYPE htm ...

  2. Codeforces 1029 E. Tree with Small Distances(树上dp)

    题目直通车:http://codeforces.com/problemset/problem/1029/E 思路大意:在树上做dp,依次更新ar数组,ar[i]表示以i为根节点的子树对答案的最小贡献值 ...

  3. Binary Tree Maximum Path Sum - LeetCode

    Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequence ...

  4. POJ 1990 MooFest(zkw线段树)

    [题目链接] http://poj.org/problem?id=1990 [题目大意] 给出每头奶牛的位置和至少要多少分贝的音量才能听到谈话 现在求奶牛两两交流成功需要的分贝*距离的总和. [题解] ...

  5. EF执行存储工程报错 String[4]: Size 属性具有无效大小值 0。

    EF中执行存储过程报错 String[4]: Size 属性具有无效大小值 0 排查后是如下问题所致,给定的参数没有设定大小(加入红框内的就可以了) private string GetCode(MC ...

  6. Delphi 使用 SPcomm 调试串口程序出现总是在程序断开的时候,才发送指令的问题。

    问题如上, 在与嵌入式程序串口程序通讯的时候, 总是出现如上问题, 造成的原因把下面的True改成false就可以了. 下图Spcomm的属性页,几个True全改成False再试试

  7. java的几个特性

    前言 本文主要介绍java语言的三个特性:类型协变和逆变,动态代理和静态代理,注解. 协变和逆变 借用Treant的博文,逆变与协变用来描述类型转换(type transformation)后的继承关 ...

  8. WinForm-SQL查询避免UI卡死

    使用委托,呵呵. Func<List<VM>> act = () => { SqlDataReader reader = DBHelper.ExecuteReader(s ...

  9. squid.conf 的cache_peer 详解

    通过squid.conf配置文件中的cache_peer选项来配置代理服务器阵列,通过其他的选项来控制选择代理伙伴的方法.Cache_peer的使用格式如下: cache_peer hostname ...

  10. BindVertexbuffer

    stride 的意思是 inputstream.layout 的大小 比如 description是 pos uv normal stride 就是一组pos uv normal的大小 ns  里面 ...