类的6个默认成员函数
即使在空类中,编译器也会自动生成如下6个成员函数:
学习角度
我们从以下两个方面学习这几个函数:
①基本语法特性:函数名,参数,返回值,调用的时候。
②编译器默认生成这个函数时,函数的作用
一、构造函数
概念:是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,且只在对象的生命周期中调用一次。
特性:
①函数名与类名相同
②无返回值
③对象实例化时编译器自动调用对应的构造函数
④构造函数可以重载
⑤无参的构造函数和全缺省的构造函数都为默认构造函数,并且默认构造函数只能有一个。
⑥默认构造函数只对自定义类型进行初始化,对内置类型不处理。
初始化列表
在下列情况初始化必须在初始化列表中:
①引用成员变量
②const成员变量
③自定义类型成员(此类没有默认成员函数)
由于引用成员和const成员都不能在函数体内用=进行初始化,因此都须在初始化列表中进行初始化。
二、析构函数
概念:与构造函数功能相反,析构函数在对象销毁时调用,完成类的一些资源清理工作。
特性:
①析构函数名是类名前加上字符~
②无参数无返回值
③一个类有且只有一个析构函数,若未显式定义,系统自动生成默认的析构函数。
④对象生命周期结束时,C++编译系统自动调用析构函数。
⑤编译器自动生成的析构函数,对自定义成员进行调用。
三、拷贝构造函数
概念:只有单个形参,该形参是对本类类型对象的引用(一般用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
特性:
①拷贝构造函数是构造函数的一个重载形式。
②拷贝构造函数的参数只有一个且必须用引用传参,使用传值的方式会引发无穷递归调用。
③内置类型进行浅拷贝,自定义类型进行深拷贝。
拷贝构造函数一般在以下情况下被调用:
①用于对象的初始化:
Date d1(0,0,0);
Date d2(d1);
Date d3=d1;//用于初始化调用拷贝构造函数
②函数传参为传值时,会先调用拷贝构造函数对形参进行初始化
③函数返回值为类时,先调用拷贝构造函数,再返回
四、赋值运算符重载
概念:运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
特性:
①函数名字为:关键字operator后面加需要重载的运算符符号
②函数模型为:返回值类型+operator+操作符+(参数列表)
③ 其中*、::、sizeof、?:、.五个运算符不能重载。
调用时与拷贝构造函数的区别:
若产生新对象(初始化)则调用拷贝构造函数;对已有对象进行赋值则调用赋值运算。
Date d1(0,0,0);
Date d2;
d2 = d1;//先创建d2对象,再赋值,这里不调用拷贝构造函数
-----------------------------------------------------------------------------------------
Date d1(0,0,0);
Date d2=d1;//用于初始化调用拷贝构造函数