类的6个默认成员函数
class Data{}
当类中什么都没有时,把它称为空类
当类为空类时,编译器会自动为它生成6个默认成员函数
默认成员函数的定义:用户没有显式实现,编译器会生成的成员函数
1.构造函数,完成初始化工作
2.析构函数,主要完成清理工作
3.拷贝构造,通过同类对象初始化创建对象
4.赋值重载:把一个对象赋值给另一个对象
5.普通对象的取地址
6.const对象取地址
构造函数
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型时由编译器自己调用,以保证每个数据成员都有一个合适的初始值,在对象的整个生命周期内只调用一次。
构造函数的任务是初始化对象
它有如下特性
1.函数名与类名相同
2.无返回值
3.对象实例化时编译器自动调用对应的构造函数
4.构造函数可以重载
5.如果类中没有显式定义构造函数,C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不会自动生成
6.C++把类型分为内置类型(基本类型)和自定义类型。
>>内置类型就是语言提供的类型(比如int,char)
>>自定义类型就是class,struct,union等自己定义的类型
自定义类型实际上又会由内置类型构成
注:在C++11中,内置类型成员变量在类中声明时可以给默认值
7.构造函数中又有默认构造函数,包括无参的构造函数和全缺省的构造函数,并且这两种有且仅有一个一种。
(没有写构造函数,编译器默认生成的函数也叫默认构造函数)
析构函数
概念:析构函数不是完成对对象本身的销毁,局部对象的销毁工作是由编译器完成的。对象在销毁时会自动调用析构函数,完成对象中资源清理的工作
特性:
1.析构函数名是在类名前加上~
2.无返回类型,而且无参数
3.一个类中只能有一个析构函数。如果没有显式定义析构函数,系统会自动生成默认的析构函数
(注:析构函数不能重载)
4.对象生命周期结束时,C++编译系统自动调用析构函数
5.创建某个类的对象则调用该类的构造函数,销毁这个类的对象则调用该类的析构函数
6.如果类中没有申请资源,可以不写析构函数,直接使用编译器自动生成的析构函数,比如Date类。如果有资源申请,那么一定要写析构函数,不然会造成资源的泄漏,比如Stack类。
拷贝构造函数
概念:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在使用已存在的类类型对象->创建新对象时,由编译器自动调用
特征:
1.拷贝构造函数时构造函数的一个重载形式
2.拷贝构造的参数只有一个,而且必须是对类类型对象的引用,使用传值方式编译器会直接报错,因为会引发无穷递归调用(相当于传参时,再次调用该函数)
3.若未显式定义,编译器会默认生成默认的拷贝构造函数。默认的拷贝构造函数对象内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝
(注:在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的)
4.类中没有涉及资源申请时,拷贝构造函数是否写都可以。一旦涉及资源申请时,拷贝构造函数是一定要写的,否则就是浅拷贝
5.拷贝构造典型调用场景
>>使用已存在对象创建新对象
>>函数参数类型为类类型对象
>>函数返回值类型为类类型对象