cpp程序设计兼谈对象模型

cpp面向对象程序设计——侯捷

内容

  1. 目标:泛型编程和面向对象编程
  2. cpp的转换函数,可以将类型进行转换,但是要注意,不要乱用,否则会造成编译器的二义性
    • 如果在构造函数前面加上explicit时候,就是告诉编译器不要随便的把一些类型进行转换
  3. cpp的一个类做出来之后可以像一个指针,也可以像一个函数。你为什么想把类看起来像一个指针呢?因为你想比指针再多做一些事情,这种也叫智能指针。比如shared_ptr。
  4. 什么样的操作符可以作用在指针上面呢?一个是*,一种是->。星号作用一次就直接被消耗了,而箭头符号作用下去会继续作用下去。
  5. 迭代器这种智能指针会需要++和——。
  6. 将一个类做的像一个函数,实际上就是可以对括号,进行重载。这也叫仿函数。
  7. 类模板:也就是在设计一个类的时候,你觉得哪些类可以抽象出来,就可以使用类模板。
  8. 函数模板,将一个函数抽象出来
  9. 成员模板,鲫鱼继承自鱼类,麻雀继承自鸟类,那我在初始化父类的时候是可以使用鲫鱼和麻雀来进行赋值的。
  10. 模板的特化分为全特化和偏特化
  11. 模板模板参数
  12. cpp标准库,把所有的代码进行测试一下!
  13. 数量不定的模板参数,使用的是三个点,…
  14. 使用auto关键字的时候,需要能够让编译器进行推测
  15. 引用一定要有初值,而且带边了之后就不允许再改变了。指针多大,一般32位机器下是4个字节,而引用的大小是根据代表的物体不同而大小不同,而实际上,内部的底层的实现由指针实现的。它的大小地址等是由编译器所创建的假象。
  16. reference其实是一种漂亮的指针
  17. 函数签名是函数的唯一标识符,const也可以用来区分函数签名
  18. 构造是由内而外的,而析构是由外至内。当继承和组合一起的时候,对于子类的构造,是先父类的构造,再组合的构造。析构的时候,先组合的构造,再父类的构造。上面这种情况cpp是没有明确规定的,属于编译器实现的部分。
  19. 虚指针和虚页。类中只要有一个虚函数,就会有一个虚指针,也就是它比正常的大小要多一个指针的4个字节。
  20. 继承的时候,数据是全部继承下来的,函数的继承,是继承的函数的使用权。父类由虚函数,子类也一定有虚函数。
  21. c++的编译器看到一个函数调用,它会有两种考量,一种是静态绑定,一种是动态绑定。静态绑定也就是使用汇编的call指令,直接进行调用,而使用动态绑定则是根据虚指针去看虚页表,然后再看绑定的函数是什么。静态绑定一定调用某一个地址,而动态绑定则需要看p的指向是什么。
  22. 什么时候是动态绑定呢?也就是虚机制。
  • 使用指针调用,就是->,而不是点.的形式
  • 指针需要向上转型
  • 使用虚函数
  1. 当然上面的这种虚函数的用法,也叫做多态。
  2. 通过对象调用一个函数,这个对象的地址就是this指针。
  3. 虚函数的使用一般有两种,一种是上面的动态绑定的多态,一种是下面马上说的模版方法。
  4. 父类中有一些方法,不知道具体的实现,需要在子类中实现,就需要写成虚函数。使用子类的时候,使用子类的对象调用父类的函数,这是可以的,子类对象调用父类的函数就会把子类对象的地址作为this指针传入父类的函数中,当父类中的方法执行到虚函数的时候,就会使用this->serialize的方式进行调用,而这个时候的this指针指向的是子类的虚表,那么就会调用子类的实现,而不是父类的实现。也就实现了多态。
  5. 成员函数后面的const就是告诉编译器,我不打算改变成员数据,我可以读,但是一定不会改。常量对象调用非常量函数的时候,就会出问题。
  6. 当重载[]的时候,需要考虑是不是需要写,也就决定了要在函数后面是不是加const。也就是考虑COW,Copy On Write。
  7. 当成员函数的const和non-const版本同时存在的时候,const 对象只能调用const版本, non-const对象只能调用non-const版本。