1 导读
课程内容:
泛型编程(Generic Programming)和面向对象编程(Object-Oriented Programming)是C++的两大技虚术主流。
审图继承关系(Inheritance)所形成的对象模型(Object Model),包括底层的this指针,vptr(虚指针),vtble(虚表),virtual mechanism(虚机制),virtual functions(虚函数)造成的polymorphism(多态)效果。
2 Conversion Function 转换函数
转换函数CoversionFunction
例如分数,既可以有“分子分母”形式,由可以有“小数”形式。
需要使用小数形成进行计算时,编译器会使用黄色部分的函数;
Fraction f(3, 5); //5分之3
double d = 4 + f; //此时编译器将使用转换函数double0.6
转换函数固定形式:加operator、无返回值、通常有const。
3 non-explicit one argument constructor
绿色部分,第二个参数有默认值,构造时给一个参数即可。
当使用f+4时,编译器会自动选择构造函数将4填入构造函数的第一个参数(形成1分之4)。这样就可以完成了分数加整数的语句了。
但是当黄色绿色部分都存在时:
编译执行f+4的动作时就会产生歧义(ambiguous),不知如何选择。
添加explicit关键字,一个明确的构造函数:
此时f+4,编译器不会将4自动转换为1分之4。
4 pointer-like classes
将一个类设计成指针(设计一个class模拟pointer),这样这个类像指针但又比指针多了很多功能。智能指针。
这样需要重载运算符“*”和“->”。
迭代器也是一种智能指针:
标准库中的链表模型如下:
构建迭代器基本原理如下:
5 Function-like classes
设计一个类,模拟,像一个函数,仿函数。
重写括号“()”。
标准库里面有很多仿函数,重载小括号。同时继承了一些父类。
6 namespace经验谈
A设计的函数可能会和B开发出来的函数名字相同了,这样需要命名空间。
无需费劲心思的给函数和变量起名。
同时可以划分全局函数,全局变量等。
7 class template
类模板。使用时制定类型。
8 Function Template
类模板在使用的时候需要制定类型,函数模板不需要。因为编译器会做一个动作叫Argument Deduction 实参推导。
9 Member Template
任意类(模板或非模板)可以拥有本身为类模板或函数模板的成员,这种成员称为成员函数模板。
10 Specialization
特化,在类的设计时,如果使用模板,对于某些特殊的类型需要特殊处理时,需要进行泛化相反的动作,特化。
举例,如果要特殊处理char这个类型:
11 模板偏特化
偏特化(局部特化):个数上的偏,范围上的偏。
个数上偏特化:只指定bool一个类型,第二个Alloc使用模板默认值。
范围上偏特化:使用T定义一个类,再使用T*定义相同的一个类。
12 模板模板参数
黄色部分:模板里面的参数本身还是个模板。
容易有第二参数,经常不写,因为有默认值。
只有在符号“<>”内部,typename和class含义相同。
13 关于C++标准库
C++标准库提供给用户的是数据结构、容器、算法等等。
对于C++,任何编译器都要有一个值就是“__cplusplus”,可以打印出来查看版本。
14 三个主题
C++11的版本迭代器定义有了进化,因为此时编译器能够推测出“ite”的类型,所以第三中情况错误,因为编译器在读到“auto ite”时,推测不出类型:
C++11优化了便利时 的语法:
一行语句直接for循环便利“{…}”容器内的元素。
C++112.0的三个主题“VariadicTemplates可变模板”、“auto类型”、“新的for循环”。