Boolan 第四周 高级oop下
转换函数:
将本类转换为其他类型使用,转换函数没有返回类型,通常要加const,只要合理,可以写多个转换函数。
示例:
non-explicit-one-augument ctor:
可以将其他类型转换为本类。
示例
explicit:90%用于ctor,明确不能将其他类型转为本类。
示例:
pointer-like classes智能指针:
示例:其中两个重载函数未固定写法。->符号系统在使用后会自动在后面再加一个->。
迭代器:迭代器也是一种智能指针,除了重载上述操作符外,还需要重载++,--指针移动操作符。
示例:
function-like classes 仿函数:通过重载()实现
示例:
namespace:方便团队分开作业,防止重复命名
示例:
function template 函数模板:
不同于class template,函数模板编译器会自动进行argument deduction,不会产生多份代码。
member template 成员模板:
在模板类中再定义可变类型参数。
示例:
up-cast & down-cast:
在C++中,把子类的对象当做父类对象看待,就称为”向上造型“ (upcast)。
如
class manager: pubilc employee { manager(); }
manager pett;
employee *ep = &pett; //就是upcast
employee &ep = pett; //也是upcast
把父类的对象当做子类来看待,称为 downcast.
employee mob;
manager *lowe = &mob; //downcast, 将父类对象转换成子类对象
注意:向上造型是安全的,向下造型是有风险的。
specialization 模板特化:
为特定类型的参数提供特定的代码。
示例:
partial specialization偏特化:
个数偏示例:
范围偏示例:
template template parameter模板模板参数:
模板参数使用带模板的参数。
示例:
c++标准库学习:逐个测试每个容器,算法
variadic template(c++ 11):数量不确定的模板参数
示例:通过递归算法一次性打印多种不同类型数据
auto(c++11):编译器自动识别数据类型,但必须在申明同时进行赋值操作,否则编译器无法识别报错。
ranged-base for(c++11):
示例:
reference引用:通常不用于申明变量,而使用于传参和修饰返回值。
函数签名signiture:相同签名不能同时存在,否则引起编译器二义性报警。
示例:
class的字节对齐:
这是编译器对变量存储的一个特殊处理。为了提高CPU的存储速度,编译器对一些变量的起始地址做了“对齐”处理。在默认情况下,规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
下面列出常用类型的对齐方式: 类型 对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
Char 偏移量必须为sizeof(char)即1的倍数
int 偏移量必须为sizeof(int)即4的倍数
float 偏移量必须为sizeof(float)即4的倍数
double 偏移量必须为sizeof(double)即8的倍数
Short 偏移量必须为sizeof(short)即2的倍数
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节编译器会自动填充。同时编译器为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。