【博览网】面向对象编程下——第一周课程笔记
课程目标:
• 了解泛型编程和面向对象编程
• 了解继承关系的结构,底层虚函数的实现方法
第一周主要介绍了C++比较特别的编程设计方法,以及C++新标准的一些语法特性。在课程内容中,部分内容在之前的课程中已经介绍过了,在此略去相关的笔记。
一、编程技巧
1.转换函数
转换函数是实现对象类型转换的函数,可以实现将对象转换为基本类型的功能。其基本形式如下:
Operator double const(){
}
同时,C++中也允许程序员通过构造函数的方式将其他类型的对象或者基本类型转化为所需要的类类型。
需要注意的是,上述两种方式在程序中会被自动调用。如果你不希望自己写的构造函数被自动调用为转换函数,可以在构造函数前加explicit关键字来避免。
2.pointer-like class智能指针
智能指针简而言之就是行为类似指针的类。这种类一般通过重载*、->等运算符使其行为与指针类似,因此可以当作指针使用。当然,智能指针在行为上类似指针,但是其本身肯定有与指针不同之处,这些不同之处会使得指针更佳的“智能”。这种类型的class在标准库中有很多应用。
3.function-like class 仿函数
仿函数简而言之就是行为类似函数的类。这种类一般通过重载()运算符实现,获得与函数类似的特征。这种类型与函数指针是相似的,因此在使用泛型时会广泛运用。
二、模版
1.模版的类型
模版分为类模版和函数模版,这两种模版的语法在之前的课程中已经介绍过了,因此在此不再作介绍。
2.成员模版
成员模版旨在模版类内部的再建立一个模版,其语法结构如下图所示:
使用成员模板的目的是在类模板中使用与类其他部分无关的类型,作为函数的参数来实现某些功能。实际上,成员模板的模板参数直接在类模板上标明也是可以的,成员模板最主要的便捷之处在于使代码更加简洁和清晰。
3.模板特化
模板特化是泛型编程的一个十分重要的特性,他可以使一些比较特别的类型按照特殊的处理来进行编程,以获得效率上的提升,并且可以避免错误。模板特化的一些语法方式如下所示,代码已经很明确的展示了该种语法的特点了,就不做过多的解释了。
普通特化:
个数偏特化:
类型偏特化:
4.模板模板参数
即在模板参数中,可以使用模板做模板参数。这个特性可以使模板获得更大的灵活性,但是平时用途比较少,因此不作详细的介绍。
三、C++11的三个新特性
1.数量不定模板参数
简单的说就是模板参数个数可以是不定参数,语法如下图所示:
使用sizeof…()可以获取模板参数组的个数。这个新特性是一个十分重要的特性。
2.auto
可以使用auto关键字自动为变量设置类型。该关键字只能用于能够推断出变量类型的时候,如获取函数的返回值,获取函数指针等情况下。
3.range-base for
数组或者容器的遍历可以使用如下形式进行:
注意:前者返回的是拷贝值,后者返回的是一个引用值。
四、关于引用
这幅图比较清晰的展示了变量、引用和指针三者的关系。这里补充一下,从底层实现的角度来看,所有的引用都可以看作是const指针,但是,为了让引用看起来更加“真实”,因此所有对引用的操作的结果看起来和对原数据的操作是一样的,比如取地址,sizeof等。