C++ Primer CH19 大型工程的工具和技术

19.1 控制内存分配

当对内存分配有特别需求的时候可以重载 new 和 delete 操作符来控制内存分配。

19.1.1 重载 new 和 delete

重载 new 和 delete 操作符的方式与重载其它操作符的方式有非常大的不同。当使用 new 表达式时会依次发生三件事:1. 调用库函数 operator new 或者 operator new[] 来分配足够的裸的没有类型的内存以存储对象或数组。2. 调用构造函数构造对象。3. 返回指向这个新分配构建的对象的指针。

当使用 delete 表达式时将发生两件事。1. 调用析构函数进行析构;2. 编译器调用库函数 operator delete 或者 operator delete[] 来释放内存。

定义自己的 operator new 和 operator delete 函数可以 hook 掉内存分配过程。即便是库中已经包含了这些函数的定义,我们依然可以定义自己的版本,而编译器并不会抱怨说重复定义。反而,编

阅读全文 “C++ Primer CH19 大型工程的工具和技术”

C++ Primer CH18 异常、名称空间和多重继承

C++ 可以处理的问题的范围十分广泛,从只需要一个程序员在几个小时内就能解决的小问题,到需要涉及到多个系统协作,有着百万行级别的代码量,并且需要几百个程序员在多年时间内参与的大问题(如:操作系统)。本书前面章节介绍的内容同时适合于所有这些跨度的问题。

语言还包括一些针对大的复杂系统而设计的特性。这些特性包括:异常处理(exception handling),名称空间(namespaces)和多重继承(multiple inheritance),这是本章将阐述的内容。

大型规模编程(Large-scale programming)对语言的要求要远高于小团队开发的系统对语言的要求。这些要求包括:

  • 在独立开发的多个子系统间处理错误;
  • 使用独立开发的库而不产生名称冲突;
  • 对更加复杂的应用概念进行建模;

本章将讲述针对以上需求而设计的语言特性:异常、名称空间和多重继承。

18.1 异常处理

异常处理(Exception handling)允许独立开发的程序部分可以在运行

阅读全文 “C++ Primer CH18 异常、名称空间和多重继承”

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 面向对象编程”