C++ Primer CH16 模板和泛型编程

面向对象(OOP)和泛型编程(generic programming)都是处理在书写程序时未知的类型,所不同的是 OOP 处理直到运行时才知道的类型,而泛型编程则处理知道编译时才知道的类型。

当书写泛型程序时,写出来的代码与特定类型是独立的。当使用泛型程序时则需要提供类型或者值(作为泛型实参)给泛型代码。

模板(Template)是泛型编程的基石,使用模板并不需要太多关于模板的知识。在本章将学习如何定义自己的模板。

模板是 C++ 中的泛型编程的基石。模板是编译器生成类和函数的蓝本(blueprint)或公式(formula),当使用泛型类型(generic type)或者泛型函数(generic function)时,必须提供必要的信息从而将蓝本转换为特定的类或函数,转换过程发生在编译期间。

16.1 定义模板

为每个类型都定义相同的操作是十分繁琐的,而且需要知道所有操作的类型,更合理的方式是定义函数模板,然后在使用时提供类型即可。参考代码:template.cc

阅读全文 “C++ Primer CH16 模板和泛型编程”

C++ Primer CH15 面向对象编程

面向对象变量建立三大概念上:数据抽象(data abstraction)、继承(inheritance)和动态绑定(dynamic binding)。继承和动态绑定在两个方面影响如何写程序:使得定义类似但不相同的类更加容易,使得用户代码可以相同的方式调用它们而忽略其中的差异。

很多应用包含相关但是有略微不同的概念。面向对象编程(OOP)刚好非常适合这种应用。

15.1 面向对象:介绍

面向对象编程(object-oriented programming)的关键思想在于数据抽象、继承和动态绑定。使用数据抽象,可以将类的接口和实现进行分离。通过继承,可以定义概念上相互关联且类型相似的类。通过动态绑定,可以在使用这些对象时忽略它们的细节上的不同。

继承

通过继承关联起来的类组成了层级。通常层级的顶端是一个基类(base class),其它类直接或间接的继承之,这些继承的类称之为派生类(derived classes)。基类定义层级中所类型都共通的成员,每个派生类定义特定于

阅读全文 “C++ Primer CH15 面向对象编程”

C++ Primer CH13 拷贝控制

C++ 的核心概念就是类。C++ 类定义构造函数来控制当类对象初始化时应该做什么。类同样可以定义函数来控制如何进行拷贝、赋值、移动和销毁。在这些方面 C++ 有别于其它语言,很多其它语言并不提供控制这些方面的基础设施。本章将介绍拷贝控制方面的知识,并且将引入新标准的两个概念:右值引用(rvalue reference)和移动操作(move operation)。

十四章则主要讲类类型如何进行操作符重载(operator overloading),使得类可以像内置类型一样使用内置操作符。其中值得注意的是调用操作符(function call operator),这样就可以像调用函数一样,对对象进行调用。并且将介绍新的库设施来简化不同类型的可调用对象,使其以统一的方式书写。最后还会讲特殊的成员函数——转换操作符(conversion operator),将定义从类对象到别的类型的转换。

写自己的面向对象或泛型需要对 C++ 有一个很好的理解,接下来几章的内容将是很高级的主题。

阅读全文 “C++ Primer CH13 拷贝控制”

C++ Primer CH12 动态内存

新版本的 C++ 最重要的更新之一就是提供了更为强大的智能指针(smart pointer),智能指针是模拟指针的抽象数据结构,提供了额外的功能包括内存管理(memory management)或者界限检查(bounds checking)。这些特性在保留性能的情况下,减少了因为指针滥用导致的难以查找的 bug。智能指针常用于跟踪其指向的内存,亦可用于管理其它资源,比如:网络连接和文件句柄。

智能指针能够自动回收内存,对象自动析构。但拥有对象的最后一个智能指针销毁时(本地变量离开其作用域),其会自动析构对象并回收内存。其中 shared_ptr 通过引用计数来实现,而 unique_ptr 则完全拥有其指向的对象。

有自动垃圾回收机制的语言不需要智能指针用于内存管理,但依然可以用于缓存管理和其它资源管理(如:文件句柄和网络)。

前面章节介绍的对象使用都没有动态内存。全局对象在程序启动时分配,并在程序结束时销毁。本地自动对象在指令流经过其定义位置时创建,在离开其创建块时销

阅读全文 “C++ Primer CH12 动态内存”

C++ Primer CH7 类

C++ 中最重要的特性之一就是类,通过类可以有效表达代解决的问题中的概念。类讲求数据抽象(data abstraction),即是将类的实现与类所能表达的功能分离开来。类背后的哲学就是数据抽象和封装(encapsulation)。

数据抽象意在将不必要的细节剥离出来以期更加接近问题的本质特性。数据抽象往往是设计系统的第一步,原因在于完整的系统非常复杂,几乎不能在没有一个简单抽象的情况下一步完成。数据抽象使得可以从最本质的特性开始然后一步步丰富到最终的系统。有一些别的术语与此相近,比如:建模(modeling)、泛化(generalization)。抽象是设计一些软件的开端,亦是最重要的武器。

封装则是两个相关但不同概念的组合:将对象状态隐藏使得外部无法直接访问;将数据和方法打包到一起;在一些语言中隐藏组件不是自动发生的,甚至不可能隐藏,因而,在这些语言中只有第二种含义。而第一种含义有另外一个术语表示:信息隐藏(information hiding)。

类使用数据抽象和封

阅读全文 “C++ Primer CH7 类”