banner

有的特征。

可将狗进一步划分为猎犬和宠物犬,而宠物犬又可分为约克夏梗(Yorkshire terriers)、矮脚狄文梗(Dandie Dinmont Terriers)等。

tips

约克夏梗是一种宠物犬,因此是一种狗,是一种哺乳动物,是一种动物,是一种生物。

为表示这些关系,C++将类定义为从另一个类派生而来。派生是一种表示“是一种”关系的方式。可从类Mammal派生出新类Dog,在这种情况下,无需显式地指出狗能够走动,因为它从Mammal那里继承了这种功能。Dog是从Mammal派生而来的,它自动获得了走动的功能。

如果一个类在现有类的基础上添加了新功能,那么这个类就被称为让它的析构函数删除被指向的内存。这正是auto_ptr背后的思想。

16.2.1 使用auto_ptr

auto_ptr模板定义了类似指针的对象,可以将new获得(直接或间接)的地址赋给这种对象。当auto_ptr对象过期时,其析构函数将使用delete来释放内存。因此,如果将new返回的地址赋给auto_ptr对象时,无须记住稍后释放这些内存。在auto_ptr对象过期时,这些内存将自动被释放。图16.2说明了auto_ptr和常规指针在行为方面的差别。

要创建auto_ptr对象,必须包含头文件memory,该文件包括auto_ptr模板。然后使用通常的代码描述了一种经常发生的场景:

void fiddle(std::shared_ptr f); … shared_ptr myFoo = make_shared(); … fiddle(myFoo);

myFoo 拥有动态变量的实例 Foo 。当程序调用 fiddle() 时,会创建第二个指向动态 FOO 实例的链接,并增加 shared_ptr 的引用计数。当 fiddle() 返回时,shared_ptr 参数会释放它对动态 FOO 实例的所有权,但调用方仍然拥有指针。这次调用的最小开销是一次无谓的原子性增加和减小操作,而且这两次操作都带