一、导读
(1)泛型编程和面向对象编程分属不同的思维。
(2)由继承关系所形成的对象模型,包含this指针,vptr指针,vtbl虚表,虚机制,以及虚函数造成的多态。
二、conversion function 转换函数
(1)通过指定关键字operator,如operator type() const {} ,并在其后加上转换的目标类型后,我们就可以声明转换函数。转换函数必须是成员函数,它的声明不能指定返回类型和参数列表。
分数Fraction型转换成double型,返回类型不用写,默认为double型,没有形参。
三、non-explicit-one-argument constructor
(1)explicit这个关键字基本只出现在构造函数前面,意思是需要明确地调用这个构造函数才能调用,编译器不再存在暗中、自动的转换操作。
(2)构造函数两个参数,第二个参数有个默认值为1;one-argument表示只需要一个实参就可以调用该函数。
四、pointer-like classes 智能指针
(1)设计一个class,使它的行为像指针。主要包括两种:智能指针和迭代器。
(2)shared_ptr智能指针类的行为与指针类似:需要重载操作符 * 和操作符->。
(3)迭代器作为一个种智能指针,除了需要重载操作符 * 和操作符->外,还需要重载其他操作符,例如,操作符 ++。
(4)智能指针在C++11版本之后提供,包含在头文件
五、function-like classes 仿函数
(1)设计一个class,使它的行为像函数。
(2)在类中实现一个operator()重载,这个类就有了类似函数的行为,就是一个仿函数类了。
六、namespace经验谈
不同的命名空间用于规避不同团队开发的接口的冲突。
七、class template 类模板
八、function Template 函数模板
九、member Template 成员模板
在这个例子中,成员模板的类型,需要满足一个条件:T1可以放进U1.first中,T2可以放进U1.second中,即U1.first的类是T1的基类,U1.second的类是T2的基类。
十、specialization 模板特化
(1)template <>中,<>里面没有类型的参数了,参数类型在后面绑定,即特化。
(2)template
编译器编译时,会确定模板是否存在特化,如果存在特化,优先使用特化代码。
十一、partial specialization 模板偏特化
这个偏特化的例子中,一个参数被绑定到bool类型,而另一个参数仍未绑定需要由用户指定。
在编译C
十二、模板模板参数
(1)模板的参数类型也是模板。
(2)只有在模板<>尖括号中,关键字typename与class是才通用的。
(3)带模板模板参数的模板,在第一次具体模板参数时,模板模板参数仍然未明确。
十三、关于C++标准库
网站http://cpprocks.com/c11-compiler-support-shootout-visual-studio-gcc-clang-intel/
十四、三个主题( 和C++11有关)
例:template
获取模板参数个数方法:sizeof...(Types)。
decl:定义一个变量;coll:指定一个容器。
例子:
变量遍历可以传引用。
十五、reference
r必须要有初值。
r不能再代表其他变量。
编译器会处理对r进行处理,使其object和reference的大小相同,地址也相同(全都是假象),即:
-------------------下面讲的是对象模型Object Model,即class和class之间的关系-------------------
十六、复合&继承关系下的构造和析构
十七、关于vptr和vtbl
通过指针(引用)调用;向上转型(子类到父类);调用的是虚函数。
十八、关于this指针
(1)Template Method(模板方法设计模式)。
(2)this可以理解为一个指针,也可以看作一个对象this object。
(3)在C++里,所有的非static成员函数,都有一个隐藏的参数 this。
十九、关于dynamic binding
动态绑定的发生,需要满足三个条件:1.指针(引用)调用;2.向上转型;3.调用虚函数。
-------------------------对象模型Object Model内容结束,以下是追加的课题 --------------------------
二十、谈谈const
二十一、关于new, delete
二十二、operator new,operator delete
二十三、重载operator new,operator delete示例
二十四、重载new(), delete()示例
二十五、basic_string使用new(extra)扩充申请量