C++关于代码重用的那些事

    C++的另一个目标是促进代码重用。公有继承是实现这种目标的机制之一,但并不是唯一的机制。还可以使用这样的类成员:本身是另一个类的对象,这种方法称为包含、组合或层次化。另一种方法是使用私有继承或保护继承。类模板是另一种重用代码的方法,类模板使我们能够使用通用术语定义类,然后使用模板来创建针对特定类型定义的特殊类。

包含对象成员的类

    通过组合(包含)即创建一个包含其他类对象的类,用于建立has-a关系。使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现),获得接口是is-a关系的组成部分。而使用组合,类可以获得实现,但不能获得接口,不继承接口是has-a关系的组成部分。
    C++包含让程序员能够限制程序结构的特性——使用explicit防止单参数构造函数的隐式转换,使用const限制方法修改数据等等。
    当初始化列表包含多个项目时,这些项目被初始化的顺序为它们被声明的顺序,而不是它们在初始化列表中的顺序。
    被包含类对象的接口不是公有的,但可以在类方法中使用它。

私有继承

    使用私有继承,基类的公有成员和保护成员都将称为派生类的私有成员,这意味着基类方法将不会称为派生对象公有接口的一部分,但可以在派生类的成员函数中使用它们,基类的公有方法称为派生类的私有方法,派生类不继承基类的接口。使用私有继承,类将继承实现。
    要使用私有继承,需要使用关键字private而不是public来定义类(private是默认值,省略访问限定符也将导致私有继承)。
    使用私有继承时,只能在派生类的方法中使用基类的方法,使用包含时将使用对象名来调用方法,而使用私有继承时将使用类名和作用域解析运算符来调用方法。

多重继承

    使用多个基类的继承被称为多重继承(MI)。C++多重继承中引进了一种新技术——虚基类。虚基类使得从多个类派生出的对象只继承一个基类对象。如果类有间接虚基类,则除非只需使用该虚基类的默认构造函数,否则必须显式的调用该虚基类的某个构造函数。
    多重继承可能导致函数调用的二义性,可以使用作用域解析运算符来确定使用的方法,更好的办法是重新定义该函数。还有一种办法是使用模块化方式。
    如果类从不同的类继承了两个或更多的同名成员(数据或方法),则使用该成员名时,如果没有用类名进行限定,将导致二义性,如果某个名称优先于其他所有名称,则使用它时,即便不使用限定符,也不会导致二义性,派生类中的名称优先于直接或间接祖先类中的相同名称。

类模板

    继承和包含并不总是能满足重用代码的需要,C++的类模板为生成通用的类声明提供了一种更好的方法,模板提供参数化类型,即能够将类型名作为参数传递给接收方来建立类或函数。

类模板的定义

    模板类以下面这样的代码开头:

template <class Type>

    关键字template告诉编译器,将要定义一个模板,尖括号中的内容相当于函数的参数列表,可以把关键字class看做是变量的类型名,该变量接受类型作为其值。class并不意味着Type必须是一个类,而只是表明Type是一个通用的类型说明符,在使用模板时,将使用实际的类型替换它,较新的C++实现允许使用关键字typename代替class。
    模板不是类和成员函数定义,它们是C++编译器指令,说明如何生成类和成员函数定义,模板的具体实现被称为实例化或具体化。由于模板不是函数,它们不能单独编译,模板必须与特定的模板实例化请求一起使用。

类模板的使用

    仅在程序中包含模板并不能生成模板类,而必须请求实例化,为此,需要声明一个类型为模板类的对象,方法是使用所需的具体类型替换泛型名。
    指定特殊的类型而不是用作泛型名称为非类型或表达式参数,表达式参数可以使整形、枚举、引用或指针,模板代码不能修改参数的值,也不能使用参数的地址,实例化模板时,用作表达式参数的值必须是常量表达式。

模板多功能性

    可以将用于常规类的技术用于模板类,模板类可用作基类,也可用作组件类,还可用作其他模板的类型参数,模板的多功能性有:
- 递归使用模板,在模板语法中,维的顺序与等价的二维数组相反。
- 模板可以包含多个类型参数。
- 可以为模板类型参数提供默认值。

模板具体化

    类模板有隐式实例化、显式实例化和显式具体化,它们统称为具体化。模板以泛型的方式描述类,具体化是使用具体的类型生成类声明。
- 隐式实例化
    一般使用的都是隐式实例化:声明一个或多个对象,指出所需的类型,而编译器使用通用模板提供的处方生成具体的类定义。
- 显式实例化
    当使用关键字template并指出所需类型来声明类时,编译器将生成类声明的显式实例化,声明必须位于模板定义所在的名称空间中。
- 显式具体化
    显式具体化是特定类型(用于替换模板中的泛型)的定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值