目录
- conversion function,转换函数
- one-argument ctor,仅需要一个实参的构造函数
- pointer-like classes,关于智能指针
- pointer-like classes,关于迭代器
- function-like classes,所谓仿函数
- namespace经验谈
- class template,类模板
- function template,函数模板
- Member Template,成员模板
- specialization,模板特化
- partial specialization,模板偏特化(局部特化)
- template template parameter,模板模板参数
- 关于C++标准库
- 三个主题
- Reference
- 复合&继承关系下的构造和析构
- 关于vptr和vtbl(虚指针和虚表)
- 关于this
- 关于Dynamic Binding,动态绑定
- 关键字const
- 关于new,delete
- basic_string使用new(extra)扩充申请量
conversion function,转换函数
转换函数详细讲解链接
在C++中 当类的构造函数参数只有一个内置类型的形参或除了第一个形参外其他的参数都有默认值时,允许把这种内置类型赋值给类对象,这是一种隐试类型转换。
fraction分数,分子除以分母就是一个double值
operator double函数的意思就是当fraction对象需要变成double的时候就可以调用此函数,由于分子分母都不会改变因此给operator double函数加上const。此时当fraction对象参与double时都会自动调用此函数变成double类型
只要你认为合理,你就可以添加转换函数。
double d = 4 + f;这一语句会首先查找Fraction是否有重载操作符 operator + (double, Fraction) 的函数,由于没有,所以调用会转换函数operator double() const。
one-argument ctor,仅需要一个实参的构造函数
non-explicit,不明确的
表示在某些情况下可以隐性的将非fraction对象通过构造函数转换成fraction对象
d2=f+4,+符号左边是fraction对象,fraction类中有写operator+的函数必须与相同的fraction对象相加,因此考虑将4转为fraction对象于是调用蓝色部分的构造函数将4转换成fraction(4,1)
如果这两个函数并存,这时候编译器就不知道转换f还是4就会报错
只要某个操作对于编译器来说有不止一条路可行,则编译器就会报错
explicit,明确的
表示不可以隐性的转换对象,例如不能再将3转换成3/1的fraction对象
此时4就不会再变成fraction对象
bool表示vector(容器)传出来的值是真或假,对操作符[]重载的意义在于判断传出的某一个位置的值如第三个位置或者第一百个位置的值是真或假,而传出来的是reference对象,此对象对应的是_bit_reference,用这个类代表/代理本应该传出的值即bool值。
果然再_bit_reference中有将reference对象转换成bool类型的函数
pointer-like classes,关于智能指针
一个C++的class会像两种东西
1.像指针
2.像函数
像指针的class其中一定会有一个真正的指针,如上图所示指针所能做出来的动作,这个class也必须要做出来。new Foo得到一个指针放到shared_ptr对象sp中,sp通过构造函数创建出指向Foo对象空间的指针。
智能指针类中一定要有*和->
sp转换成px,其中的星号已经被消耗掉了
->有一个特殊的行为,消耗->符号得到的东西要继续用->符号作用下去
pointer-like classes,关于迭代器
容器本身带着迭代器,迭代器也是一种智能指针,但与普通智能指针不一样。
迭代器常用于遍历容器
标准库容器的链表如上图所示,链表的迭代器为node,node就是上一幅图中的link_type node。
我们使用迭代器的时候,使用星号的时候就表示我们想要获取它的值(即node对应的data)。
->重载中的operator*()用的是上面那个函数