类的六个默认成员函数:
构造函数
拷贝构造函数
析构函数
赋值操作符函数
取地址操作符重载
const修饰的取地址操作符重载
构造函数:
构造函数是一种随着对象创建而自动被调用的公有成员函数,仅在定义对象时自动执行一次,它的主要用途是为对象作初始化
构造函数是特殊的成员函数,其特征如下:
函数名与类名相同
无返回值
对象构造(对象实例化)时系统自动调用对应的构造函数
构造函数可以重载
构造函数可以在类中定义,也可以在类外定义
如果类定义中没有给出构造函数,则C++编译器自动产生一个默认的构造函数,但只要我们定义了一个构造函数,系统就不会自动生成默认的构造函数
无参的构造函数和全默认值的构造函数都认为是构造函数,并且默认的构造函数只能有一个
类的析构函数:当一个对象的生命周期结束时,C++编译器会自动调用一个成员函数,这个成员函数即析构函数,析构函数是特殊的成员函数
析构函数名是在类名前加上字符 ~
无参数无返回值
一个类有且只有一个析构函数,如果没有显式定义,会自动生成默认的析构函数
对象生命周期结束时,会自动调用析构函数
析构函数不是删除对象,是做一些对象删除前的相关清理工作
类的拷贝构造函数:创建对象时使用同类对象来进行初始化,这时所用的构造函数称为拷贝构造函数
拷贝构造函数是特殊的成员函数
拷贝构造函数其实是一个构造函数的重载
拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用
若未显式定义,系统会默认生成默认的拷贝构造函数,默认的拷贝构造函数会按照成员的声明顺序依次拷贝类成员进行初始化
运算符重载:增强程序的可读性
operator + 合法的运算符 构成函数名
重载运算符以后,不能改变运算符的优先级/结合性/操作数个数
不能重载的5个运算符 :: sizeof ?: . .*
类的赋值操作符重载
对一个已存在的对象进行拷贝赋值
当程序没有显示提供一个以本类或本类的引用为参数的赋值运算符重载函数时,编译器会自动生成这样一个赋值运算符重载函数
返回*this引用:为了连续赋值 隐式类型转换
检查给自己赋值的情况 if(*this == rhs) return *this;
深浅拷贝问题:
当一个类拥有资源,当这个类的对象发生复制过程的时候,资源也进行相应复制,这个过程就可以叫做深拷贝,反之对象对象存在资源,但复制过程中并未复制资源的情况叫浅拷贝
浅拷贝时,释放资源的时候会产生资源归属不清的情况
类的const成员函数:在C++中,const修饰的变量已经变成一个常量,具有宏的属性,即在编译期间,编译器会将const所修饰的常量进行替换
const修饰类成员
const修饰类成员变量时,该成员变量必须在构造函数的初始化列表中初始化
const修饰类成员函数,实际修饰该成员函数隐含的this指针,该成员函数中不能对类的任何成员进行修改
在const修饰的成员函数可能需要对类的某个成员变量进行修改,该成员变量只需被mutable关键字修饰
类的取地址操作符重载 及 const修饰的取地址操作符重载:
这两个默认成员函数一般不用重新定义,编译器默认会生成
只有一种情况下,需要重载这两个操作符,那就是只想要别人获取到指定的内容