endl 操纵符的作用:将内存中缓存的数据刷新到设备中,调式信息时,最好都要 使用 endl 作为调试结束符。
“引用”:将左值和右值绑定在一起,即左值是右值的别名,引用必须初始化。引用没有赋值这一说法。引用只能作用在对象上。不能作用在 字面值 或是表达式的结果上。
指针:在c++中 最好 是用 nullptr 表示空指针。指针也是一个对象,所以指针也可以引用
转换函数
转换函数即在定义了一个类型的对象,使用对象赋值到其他类型时,编译器会调用转换函数将其转换为相应的类型 转换函数没有返回值,返回值类型很具 type决定 operator type() {};
non-explicit one argument
当以一个类的构造函数为 不加 explicit 修饰,且只要一个实参就可以调用该构造函数时(这种构造函数可以有两个或是两个以上参数,但是只有一个不为默认参数也符合),编译器可能隐士的将其他类型的对象转换为 该类的对象
explicit (明白的)
使用在类的构造函数中,告诉编译器不能隐式的调用该构造函数,从而将其其他类型的对象转换为该类对象。
操作符 * 重载
“ * ”可以作为乘法运算符,也可以作为 指针取值运算符,他们的区别在于,乘法运算符重载会有一个参数(成员函数运算符重载)或是 两个参数(非成员函数运算符重载),指针运算符重载时,不用写参数(成员函数运算符重载),只有一个参数(非成员函数运算符重载)
操作符 -> 重载
当操作符 “->” 重载后,返回的数值是 指针,则会继续 存在 “->” 该操作符,如果不是指针,则该操作符会结束。
操作符 () 重载
注意:类的后面加一个小括号表示产生临时对象, class A; A a 定义一个对象; A() 产生一个临时对象;
在C++中,有将类设计为函数的方式,成为仿函数,即在类中重载括号
类可以设置为像指针和像函数的示例
操作符 ::
:: 称为域操作符
有三种表示:
1.全局作用域符,::name
2.类作用域符, class A; A::name;
3.命名空间作用域符, namespace::name
注意:命名空间作用域可以和类作用域一起使用。例如 namespace::class::name;
class template and function template and member template
在类模板中会出现 template <class T> 和 template <typename T>两种类型的声称,
其中 class 有可以来定义类 class A,而 typename 可以用来告诉编译器 typename A::type 中 类A 的 type 是类型,而不是class成员。
在函数模板中,只要在函数的前面声明 template <class / typename T>,则该函数则是函数模板,类模板在使用的时候会在类的后面使用<typename> 告诉编译器类型是什么,但是函数模板则不需要,因为编译器会根据实参进行推导。
成员模板是作用在类中,为了能够支持另一种类型转换为成员模板中的类型。虽然模板类编译通过,但是实际使用根据使用者使用才能确定是不是正确
模板特化
泛化:即模板类,使用的时候在指定类型。
特化:模板类中,指定类类型的模板。
偏特化:在版本类中,需要为模板缩小个数指定,或是范围的指定。
例如:
个数的偏特化
template <typename T1, typename T2>
class A <bool, T2>
{
};
范围的偏特化
template <typename T>
class B<T*>
{
};