笔记:C++程序设计Ⅱ

笔记:C++程序设计Ⅱ

conversion function.转换函数

 

operator double()函数无返回值,返回值为double,可将Fraction类型转换为double类型。

non-explicit-one-argument ctor

 

 

 

执行+操作符时,会将4转换为Fraction类型,调用成员方法operator+

 

 

 

编译器执行+操作符时,既可以将f转换为double类型,有可以将4转换为Fraction类型,调用成员方法operator+,存在二义性,编译器会报错。

explicit-one-argument ctor

 

 

 

 

会报错是因为先将f转化为double类型,再与4相加,得到4.6,而double类型无法转化为Fraction类型(已申明explicit)。

关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生,声明为explicit的构造函数不能在隐式转换中使用。

Pointer-like classes

 

 

 

重载了操作符*和->,让这个类使用起来像指针一样,有一点需要注意,操作符->在嗲用的时候其实需要两个:sp->->method(),可以理解为编译器在这里做了优化,调用->操作符时,不会消耗掉该操作符。

function-like classes(仿函数)

 

 

 

通过重载operator(),使该类使用起来像函数一样。

member template 成员模板

 

 

 

在模板类内部,可以拥有其他的成员模板。

specialization 模板特化

 

 

 

对于模板类,在一些特殊情况下,可能有更好的处理方式处理,采用特化的,当有特化版本,且数据类型匹配时,会优先调用模板特化。

partial specialization 模板偏特化(个数的偏)

 

 

 

比如,当vector传入的数据类型为bool时,不一定需要一个1字节的大小来存储,可以只用1bit来存储,所以有个上述特化,采用Bitmap来作为实际的实现方式,更加节约内存。

partial specialization 模板偏特化(范围的偏)

 

 

 

当传入类型为指针的时候,调用class C<T*>。

reference

 

 

 

reference一般不用于参数的申明,而用于参数类型和返回类型的描述

注意:

double func(const double& im)
double func(const double im)

以上两个函数并不构成重载,二者不能同时存在。

vptr和vtbl

 

 

 

每一个含有虚函数的类,头部会有一个指向虚函数表vtbl的虚指针vptr,虚函数表vtbl是分布构建了,所以切勿在构造函数里面使用虚函数,可能会导致调用错误。虚函数表构建完成后,才能实现正确的调用,本质就是(*(p->vptr)[n])(p),这就是多态的本质。

谈谈const

 

 

之前谈过引用并不能构成重载,而const构成重载,当成员函数const和non-const时,const对象只能调用const函数。

********
posted @ 2021-11-24 22:56  maybe_fl  阅读(64)  评论(0编辑  收藏  举报