侯捷 C++面向对象高级开发(下)笔记整理

C++面向对象高级开发(下)

一、导读

(1)泛型编程和面向对象编程分属不同的思维,

(2)由继承关系所形成的对象模型,包含this指针,vptr指针,vtbl虚表,虚机制,以及虚函数造成的多态。

二、conversion function 转换函数

(1)通过指定关键字operator,如operator type() const {} ,并在其后加上转换的目标类型后,我们就可以声明转换函数。转换函数必须是成员函数,它的声明不能指定返回类型和参数列表。

   分数Fraction型转换成double型,返回类型不用写,默认为double型,没有形参。

三、non-explicit-one-argument constructor 

(1)explicit这个关键字基本只出现在构造函数前面,意思是需要明确地需要调用这个构造函数才能调用,不存在暗中、自动的转换操作。

  构造函数两个参数,第二个参数有个默认值为1;one-argument表示只需要一个实参就可以调用该函数

四、pointer-like classes 智能指针

(1)比指针更高级一些的。C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。

(2)智能指针在C++11版本之后提供,包含在头文件中,shared_ptrunique_ptrweak_ptr

 

五、function-like classes  仿函数

(1)其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。

六、namespace经验谈 

 

七、class template  类模板

 

八、Funtion Template  函数模板

 

九、Member Template 成员模板

(1)模板里面再定义模板

十、specialization  模板特化

(1)template <>  ——》<>里面没有类型的参数了,参数类型在后面绑定,即特化

        template ——》泛化

 

十一、partial specialization 模板偏特化

(1)emplate 

          class vector { //…//};
这个偏特化的例子中,一个参数被绑定到bool类型,而另一个参数仍未绑定需要由用户指定。

(2)偏特化 分:类模板偏特化、 函数模板偏特化

十二、模板模板参数 

(1)模板的参数类型也是模板

(2)  template 和  template ,只有这template <>尖括号里,class和 typename可以互相替换。typename是后来发展出来的,由于历史原因,保留着两种写法。

十三、关于C++标准库 

(1)容器Container,就是数据结构:数组,列表,队列......

(2)算法Algorithms

十四、三个主题( 和C++11有关)

(1)variadic templates 数量不定的模板参数,即模板参数可变化

例:template

(2)auto 编译器可以指导变量的类型,就在变量前面加上auto

(3)ranged-base for 即for循环的新形式

例:for( int i : {1, 2, 3, 4, 5, } )  {  }

十五、Reference

(1)变量 占内存,指针变量 int* p = &k,p里面存放的 k 是地址;

(2)int& r=k;变量r代表k的值,r在声明的时候一定要有初值。且在此 int& r=k 之后,不能再变化,指向其他的变量。

——————————————————————————————————

下面讲的是对象模型Object Model——》即class和class之间的关系

十六、复合&继承关系下的构造和析构 

(1)Inheritance下的构造和析构 ,从内存的角度去分析,子类包含父类的成分和特性,即变量和函数

(2)composition下的构造和析构

(3)Inheritance+composition下的构造和析构

十七、关于vptr和vtbl 

(1)多态,

十八、关于this 

(1)通过一个对象来调用一个函数,那么对象的地址就是this pointer。

 

十九、

关于Dynamic Binding 19 (1)

(1)const成员函数,不修改成员变量;

double real () const { return re; }

关于Dynamic Binding 

(2)new 创建一个新的对象。

B b;

A a = (A)b;

a.vfunc1();——》通过对象a来调用虚函数vfunc1(),而不是通过指针来调用,属于静态绑定,所以调用的是A的虚函数

A* pa = new B;——》new出来的对象作向上转型为A ,pa就是this pointer,调用的是A的虚函数。

pa ->vfunc1();

pa = &b; ——》向上转型

pa ->vfunc1(); ——》动态绑定;

符合动态绑定的三个条件:a,指针;b,虚函数;c,向上转型;

 

二十、关于New,Delete 

new分解为三个动作malloc ,,delete分解为两个动作 free 。

(1)new 和delete,

             new先分配内存,再调用构造函数

             delete先调用析构函数,再释放memory。

(2)new [ ] 和delete[ ] 
 

二十一、Operator new,operator delete

(1)全局的重载

         重载::operator new 和::operator delete 

         重载v::operator new [ ] 和 ::operator delete[ ] 

(2)在class里重载

         重载::operator new (size_t) 和::operator delete() 

         重载v::operator new [ ](size_t) 和 ::operator delete[ ] ()

二十二、示例 

二十三、重载new(),delete()$示例 

二十四、Basic_String使用new(extra)扩充申请量  

(1)new有四种:操作符new,operator new ,new[ ](即array new)和 placement new 

 

 

你可能感兴趣的:(C+,C)