目录
一、构造函数
二、析构函数
三、赋值运算符
四、拷贝构造
如果一个类中没有成员,我们称为空类。空类,也存在6个默认的类成员函数。
默认成员函数:用户不显示地写,编译器会默认生成的函数叫做默认成员函数。
6个默认成员函数:
构造函数:完成对象初始化 析构函数:完成对象清理拷贝构造:用同类对象构造新类 赋值重载:把一个对象赋给另一个对象
取地址重载:很少涉及
在C语言中,一个数据结构的模拟首先要完成初始化,就拿栈举例子:
初始化要确定top,确定开辟的空间,和数组的初始容量。如果没有完成这一初始化会出现诸多问题,为了防止遗忘类的初始化,引入构造函数。
在类的创建时,自动调用,用来进行初始化。
1.特性:
1)名称与类名相同,没有返回值。
2)不是开空间创建对象,是在实例化后自动调用。
3)可以重载
拿日期类举例子
.构造函数可以是重载 重载要注意二义性
.关于重载的调用
在调用无参构造函数时 不可写成 Date d1();否则编译器将认为这是一个函数声明。
.在函数重载中给缺省值
关于带参函数给全缺省,那么它与无参构造函数都为默认构造函数,不需要用户显示调用,编译器就能初始化。
默认构造函数只能出现一个,全缺省不能与无参构造函数同时出现。
在类中既有无参构造函数和全缺省构造函数,编译器能通过编译 但在创建对象时会出现二义性,不知道调用哪个函数,会出错。
5)编译器会生成默认的构造函数
如果用户没有自己显示的实现一个构造函数,那么编译器会生成一个无参的默认构造函数。
编译器生成的默认构造函数特点:
内置类型初始化为随机值,自定义类型会调用其的构造函数。
类B的默认构造函数在初始化时aa时,会调用A的构造函数,而b初始化为随机值。
6)初始化列表
对于引用和const类型的对象,在定义时必须进行初始化,而构造函数的函数体为赋值语句,无法进行初始化;
因此引入初始化列表,在对象创建时即完成初始化工作。
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟
一个放在括号中的初始值或表达式
注意:
每个成员在初始化列表只能出现一次;
引用和常对象,需要传参的自定义类型必须在初始化列表中初始化;
初始化列表的初始化顺序只与类对象声明顺序有关;
在一个类对象结束,要进行动态内存的释放。为了防止用户遗忘,引入析构函数,在对象生命周期结束时,自动调用,完成对象的内存清理工作。
特性:
1)函数名为 类名前加~ (表示与构造函数相对)
2)没有参数 ,没有返回值
3)编译器会生成默认构造函数
与构造函数一样,用户没有显示写析构函数时,编译器会自动生成析构函数
内置类型不做回收,自定义类型调用其的析构函数。
4)调用顺序类似栈结构,先创建的类,后调用析构函数。
C++为了增强代码的可读性,引入赋值运算符=
赋值运算是针对俩个已经存在的类;
关键字:operator = 有函数参数和返回值
特性:
1)在用户不显示写时,编译器会生成默认赋值运算符,其的特点是浅拷贝
浅拷贝:将目标一个字节一个字节的拷贝给目的地
涉及一块空间的拷贝不能用浅拷贝:同一块空间不能连续释放两次;因此用户自定义赋值运算符重载就非常有必要。
2)返回值是T&,减少传值的拷贝,可以连续拷贝
参数类型const T& 防止被错误修改
3)隐藏第一个参数this指针 ,检查拷贝的来源是否为自己
3)不可重载为全局函数
全局函数没有this指针,需要传所有参数
将已经存在的类,拷贝给一个新类;
其是构造函数的一个重载;
在传参时必须用引用接收参数;
否则 不带引用;会发生无限递归
要拷贝构造就要传参 传参就要调用拷贝构造 调用拷贝构造就要传参 ..........会发生无限递归
1)用户不显示写时,编译器会产生默认拷贝构造函数,是浅拷贝;
在涉及动态空间时,必须显示实现一个拷贝构造函数,否则会发生同一块空间释放俩次;
2)对象返回时,能返回引用,尽量返回引用,提高效率;
区别拷贝构造和赋值的调用
拷贝构造是一个存在的类对象,赋值是俩个类都存在;
———————————————————————————————————————————
本期的C++默认成员函数的介绍就到这。还有俩个默认的成员函数,但是基本上用不到 ,就不做介绍,对于构造函数是重要的一项,希望本文对大家有所帮助!