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

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 动态内存”