6个默认成员函数
- 任何一个类在我们不写的情况下都会生成6个默认成员函数
- 构造函数完成初始化工作
- 析构函数完成清理工作
- 拷贝构造函数是使用同类对象初始化创建对象
- 赋值重载主要是吧一个对象赋值给另一个对象
- 取地址重载主要是普通对象和const对象取地址操作符重载
构造函数
构造函数不是开空间创建对象,而是初始化对象,更严谨的说是赋初值
- 构造函数名与类名相同,无返回值,可重载
- 对对象实例化时编译器自动调用对应的构造函数,在对象的生命周期只调用一次
- 如果没有显式定义构造函数,编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成
- 无参构造函数、全缺省构造函数和编译器默认生成的构造函数统称为默认构造函数,并且默认构造函数只能有一个
class Date
{
public:
Date(int year, int month, int day)
:_year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
- 每个成员变量再初始化列表中只能出现一次
- 类中的引用成员变量、const成员变量、类类型成员变量必须放在初始化列表位置进行初始化
- 尽量使用初始化列表进行初始化,因为不管是否使用初始化列表,对于特定的成员变量一定会优先是由初始化列表初始化
- 成员变量在类中的声明次序为初始化列表中的初始化次序,与其在初始化列表中的先后次序无关
析构函数
析构函数不是完成对对象的销毁,局部对象销毁由编译器完成,而在对象销毁时会调用析构函数,完成类的一些资源清理工作
拷贝构造函数
- 拷贝构造函数是构造函数的一个重载形式
- 拷贝构造函数参数只有一个且必须使用引用传参,一般用const修饰,用传值传参会印发前无穷递归调用
- 若未显式定义,编译器会自动生成默认拷贝构造函数,默认拷贝构造函数为按字节序的值拷贝即浅拷贝
赋值重载
- 函数原型:返回值类型 operator 操作符(参数列表)
- 不能连接其他符号创建新的操作符
- 重载操作符必须有一个类类型或者枚举类型的操作数
- 由于内置类型的操作符,其含义不能改变
- 作为类成员的重载函数时,其形参看起来比操作数数目少一个成员函数的操作符有一个默认形参this,限定为第一个形参
- .*、::、szieof、?:、.这五个运算符不能重载
取地址重载
普通对象(类名* operator&(){})和const对象(const 类名* operator&()const{})取地址重载函数一般不用重载,编译器会默认生成,除非想让别人获取到指定内容需要重载