C++程序设计II兼谈对象模型(侯捷) 笔记

128 阅读3分钟

这篇文章是我学习侯捷老师课程《C++ 面向对象高级编程下-兼谈对象模型》的学习笔记。

作为Object-Oriented(面向对象)技术的主流语言,C++其实还拥有另一支编程 主线:模板与泛型编程(Templates and Generic Programming)。

本课程涵盖上述两条主线:Object-Oriented(面向对象)和泛型编程(Generic Programming)。

[本课程的课件下载](Bilibili-plus/C++-OOPBase2-HouJie/slide/C++面向对象高级编程(下)_课件.pdf at master · ZachL1/Bilibili-plus (github.com))

conversion function,转换函数

image.png

non-explicit-one-argument ctor

简单翻译:非显示的,一个实参的构造函数。如下图中的绿色部分,没有在构造函数前加explicit,且实参只有一个 num,则称该绿色的构造函数为 non-explicit-one-argument ctor

因为构造函数是 non-explicit, 所以在执行 f+4是,可以自动的将4转换类型为Fraction。

image.png

同时存在 convertion function 和 non-explicit-one-argument ctor的问题

f+4即可以把f转成 double,又可以把4通过non-explicit ctor转成Fraction,因此下面的代码,在编译阶段,会报ambiguous的错误

image.png

explicit-ctor

explicit关键字,大多数用在类的构造函数前缀。还有一个极其细微的用途,用在模板中,这个用途很少情况被用到,几乎忽略不计。

从下文中,使用了 explicit依然会保存,所以,C++中引入explicit的作用,到底是为啥呢??? image.png

pointer-like classes, 关于智能指针

关于->操作符,C++在执行操作符运算后,会自动加入一个->,这也就解释了下文中sp->method(),不是写成sp->->method()的原因。

关于C++中,为啥要设计智能指针,需要更多的例子来说明,这里没有很好解释设计智能指针的原因。

image.png

pointer-like classes, 关于迭代器

image.png

image.png

类模板

image.png

函数模板

image.png

成员模板

image.png

image.png

variadic templates 数量不定的模板参数

image.png

指针和引用

引用的场景用途:用于参数类型和返回类型

image.png

对象模型:关于虚函数和虚表

B在自己的类声明中,重新写了 virtual void vfunc1();, 因此B有自己的vfunc1,同时继承了A的vfunc2

下图中,指针p是up case,即p是 C*B*A*,都可以。通过p调用vfunc1时,是通过C的虚表找到C::vfunc1,然后执行调用。这一过程称为动态绑定。即下图中展示的代码:(*(p->vptr)[n])(p);(* p->vptr[n])(p);

关于动态绑定的三个条件:指针,指针指向的对象进行了向上转型(up cast),

image.png

对象模型:多态

下图中list<A*> myLst,同样是指针A*,但在实际执行draw函数时,会根据指针真正指向的对象,调用对应的draw函数。这被称为多态。多态的实现,是靠虚函数和虚表。 image.png

动态绑定

  • 静态绑定的例子 image.png

  • 动态绑定的例子

image.png

谈谈const

const不仅仅保证了数据的安全,更可以节省空间、提供效率。

对应右边的basic_string类, 如果是一个const 对象调用了[],则调用operation[](size_type pos) const,该函数的实现,不会去拷贝字符,节省了空间和时间。如果是一个非-const 对象调用,则调用operator[](size_type pos),该函数必须先拷贝一个字符。 image.png