转换函数(conversion function)
operator typ_name()const {}
类似于基本类型强制转换的函数,把当前类型对象变为另一个类型的对象。该函数没有返回类型,函数中return返回typ类。当需要将当前对象与typ对象做运算或者转换时会找改运算符重载,如果找不到就找转换函数进行转换之后在进行运算。可以有多种转换函数。
调用转换函数
1
构造函数中只有一个参数没有默认参数并没有explict。构造函数就可以把别的类型对象转换为当前类型,用于运算。
如果一个对象中有以上两种转换方式,如果在使用过程中两种方式都能达到目的,编译就会报错。这时候再构造函数前加explicit,构造函数就不能进行类型转换。
pointer-like classes,智能指针
对于一个class的对象像一个指针,有指针的所有功能但可以有比指针有更多的功能。class里面必然会包含一个真正的指针。
迭代器就是一种智能指针。
仿函数(function-like classes)
class对象像一个函数,即仿函数。()函数调用操作符,对()进行操作符重载就可以接受()这种操作符。对于标准库的仿函数都会继承一些奇特的基类。
namespace
多人协同作业,防止函数或类或对象的命名冲突;使用的时候用using namespace name或name::
namespace name
{
}
模板template
类模板
template <typname T>
函数模板 function template
实际使用时不用直接指明class_name。
成员模板 member template
类模板里面又有一个模板,里面的模板为成员模板。
template<class T2,class T2>
template<class U1,class U2>
下图为一个(T1,T2)pair可以由另外一个由派生类(U1,U2)产生的pair构成:
模板特化(specialization)
设计一个模板之后,将泛化部分缩小可以有的范围或固定一个。
template<>
class class_name<typ_name>{}
模板偏特化(partial specialization)
个数上的偏特化对于由多个模板参数的时候可以对其中一个或两个进行偏特化。
范围偏特化,将一个泛化类型缩小其范围,比如说任意意类型缩小为任意类型的指针。
模板模板参数(template template parameter)
模板的参数本身又是一个模板,在template上class与typename是共通的。
c++标准库
标准库提供很多容器(数据结构),算法。算法通过迭代器来操作容器。通过算法和数据结构产生程序。
数量不定模板参数(variadic templates)
模板接受的参数个数是不定的,然后在函数参数表中把其中确定个数分出来,剩下的打包。包可以继续进行处理类似于递归。
sizeof...(args),可以知道args有多少个内容;
auto 变量可以用于存放不知道类型的数据,但是不能直接定义一个auto变量不赋初值。
范围for循环(ranged-base for):
for(decl:coll)用于在容器coll里面遍历;
reference
引用和所引用的对象大小和地址都一模一样,但是对于编译器来说引用都是通过指针来实现的;引用在定义的时候就必须应用一个对象,不能在之后改变为其他对象;应用可以和所引用的对象有相同的操作。
引用一般用于函数参数传递和返回,函数参数是引用和值的不同,这种不能实现函数的重载,因为是一样的签名。而加或不加const是可以实现重载的,const是属于函数签名的一部分。
内存对齐
一个类,实例化的对象所占空间的大小并不等于,当前类中所有成员变量和虚指针所占大小的和,这是由于内存对齐的影响。内存对齐是编译器的管辖范围,编译器为程序中的每个“数据单元”安排在适当的位置上。内存对齐主要有两大作用:
1. 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常;
2. 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。能加快访问速度使程序运行效率更高。
对于内存对齐规律,对于不同的编译器由不同的对齐方法;而派生类的内存对齐是先在基类的内存对齐规律上,对基类进行构造,然后才对派生类所剩余的成员变量进行大度的内存对齐。