这篇文章是我学习侯捷老师课程《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,转换函数
non-explicit-one-argument ctor
简单翻译:非显示的,一个实参的构造函数。如下图中的绿色部分,没有在构造函数前加explicit
,且实参只有一个 num
,则称该绿色的构造函数为 non-explicit-one-argument ctor
。
因为构造函数是 non-explicit, 所以在执行 f+4
是,可以自动的将4转换类型为Fraction。
同时存在 convertion function 和 non-explicit-one-argument ctor的问题
f+4即可以把f转成 double,又可以把4通过non-explicit ctor转成Fraction,因此下面的代码,在编译阶段,会报ambiguous的错误
explicit-ctor
explicit
关键字,大多数用在类的构造函数前缀。还有一个极其细微的用途,用在模板中,这个用途很少情况被用到,几乎忽略不计。
从下文中,使用了 explicit
依然会保存,所以,C++中引入explicit的作用,到底是为啥呢???
pointer-like classes, 关于智能指针
关于->
操作符,C++在执行操作符运算后,会自动加入一个->
,这也就解释了下文中sp->method()
,不是写成sp->->method()
的原因。
关于C++中,为啥要设计智能指针,需要更多的例子来说明,这里没有很好解释设计智能指针的原因。
pointer-like classes, 关于迭代器
类模板
函数模板
成员模板
variadic templates 数量不定的模板参数
指针和引用
引用的场景用途:用于参数类型和返回类型
对象模型:关于虚函数和虚表
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),
对象模型:多态
下图中list<A*> myLst
,同样是指针A*
,但在实际执行draw
函数时,会根据指针真正指向的对象,调用对应的draw
函数。这被称为多态。多态的实现,是靠虚函数和虚表。
动态绑定
-
静态绑定的例子
-
动态绑定的例子
谈谈const
const不仅仅保证了数据的安全,更可以节省空间、提供效率。
对应右边的basic_string类, 如果是一个const 对象调用了[]
,则调用operation[](size_type pos) const
,该函数的实现,不会去拷贝字符,节省了空间和时间。如果是一个非-const 对象调用,则调用operator[](size_type pos)
,该函数必须先拷贝一个字符。