成员函数:声明在类内,定义可内可外,定义在类内则是隐式内联函数
在成员函数内部,可以直接使用调用该函数的对象的成员
类外部定义的成员的名字必须包含所属类名
this本身是一个常量指针,默认情况下指向非常量版本
在参数列表后加const可以修改this指向常量类型
编译器首先编译成员的声明,然后才轮到成员函数体
接口函数与类声明在同一个头文件内
构造函数没有返回类型,并且不能被声明成const
构造函数可以在const对象的构造过程中向其写值,直到构造函数完成初始化过程,对象才获得const属性
若是没有显式定义构造函数,编译器就会为我们的类隐式定义一个默认构造函数
默认构造函数利用类内初始值和默认初始化来初始化成员
内置类型和复合类型(数组和指针)必须赋予类内初始值,否则默认初始化就会产生未定义的值
若是类成员没有默认构造函数,那么无法默认初始化该类成员
有的编译器不支持类内初始值,这时用构造函数初始值列表
=default在类的内部的话,则该默认构造函数内联
若是构造函数的初始值列表忽略某个数据成员,则该成员以合成默认构造函数的方式隐式初始化
构造函数可以覆盖类内初始值,但一般不要介样,除非两个值不同
友元声明只能出现在类定义的内部
友元声明没有函数声明的作用,友元声明要跟类定义在同一个头文件中
类型成员必须先定义后使用
最好只在类外定义的地方说明inline
inline函数跟类定义在同一个头文件
一个mutable成员永远不会是const,即使是const对象的成员,在const函数内也能改变他
类内初始值必须用=号或者花括号
一个const成员函数如果返回this对象则是常量引用
可以通过成员函数是否是const的进行重载
不完全类型的使用场景:引用和指针,以及声明以之为参数或返回类型的函数
友元函数可以定义在函数的内部,此时隐式内联
友元关系不存在传递性,每个类负责控制自己的友元函数
声明成员函数作为友元时,需要加上所属类
声明的顺序:先定义外类,声明外函数,然后定义本类,进行友元声明,最后定义外函数
友元函数就算在类内定义也要有函数声明才可以使用
声明中使用的名字都必须确保使用前可见
成员函数体在整个类可见之后才被处理
类中使用了外层作用域的类型名之后不可以重新定义该类型名
函数体中的名字查找过程:函数体内使用前,类内,类外成员函数定义前
初始化const和引用成员的唯一机会是构造函数初始值
成员的初始化顺序与类定义内的出现顺序一致
转换构造函数:只接受一个实参的构造函数
explicit:类内声明使用,类外定义不能用,只对一个实参的构造函数有效
explicit构造函数只能用于直接初始化
聚合类:所有成员都是public和三没有:构造函数,类内初始值,基类和virtual函数
初始值的顺序必须与声明的顺序一致
字面值常量类:数据成员都是字面值的聚合类,或者至少有一个constexpr构造函数,类内初始值是一条常量表达式,类类型成员的初始值要用自己的constexpr构造函数,并且使用析构函数的默认定义
constexpr可以声明成=default或删除函数的形式
constexpr构造函数体一般来说是空的
静态成员函数不能是const的,也不能使用this指针
使用作用域运算符直接访问静态成员(成员函数可以直接使用
static只出现在类内的声明语句,类外不能重复出现
静态成员不是由类的构造函数初始化的,一般不定义在类内,将其定义与其他非内联函数定义在同一个头文件
可以为constexpr静态成员提供const整数类型的类内初始值
如果只是把有类内初始值的静态成员用于常量表达式处(编译时解析),不需要再类外定义,如若不然,类外还需要提供该静态成员的定义,并且由类内的定义来提供初始值
静态数据成员可以是不完全类型,并且可以用于默认实参