目录
1.构造函数
2.析构函数
3.构造函数(重载)
4.拷贝构造
4.1特征:
4.2写法:
4.3浅拷贝和深拷贝
5.运算符重载
6.&运算符重载和const成员
6.1权限问题
Date类中是否加const修饰
6.2取地址及const取地址操作符重载
🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉
1.构造函数
构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主要任务 并不是开空间创建对象,而是初始化对象。
特征:
不开空间
函数名与类名相同
无返回值
对象实例化时编译器自动调用对应的构造函数
构造函数可以重载(多个构造函数,多个初始化方式)
调用歧义 -只能存在一个构造。👇
2.析构函数
特征:
- 与构造函数功能相反,对象在销毁时会自动调用析构函数1,完成对象中资源的清理工作(想当于Destroy())
- 在类名前加~(按位取反)
- 无参数无返回值
- 自动调用
- 一个类只有一个析构
- 内置类型不做处理,自定义类型去调用它的析构。
像申请空间的值,有资源需要处理,需要调用析构函数。
总结:1. 有资源需要显示清理,就需要写析构,如:Stack list
2.有两种场景不需要显示析构,默认生成就可以
a、没有资源需要处理。如Data
b、内置类型成员没有资源需要清理。如MyQueue
创建对象初始化流程👇
Time _t是自定义类型,我们去Time类里找,但Time类里是内置类型,所以Time _t不会初始化。(内置类型初始化看编译器,有的初始化为1,有的不初始化)
3.构造函数(重载)
内置类型/自定义类型
内置类型:int/char/…/指针、语言提供的数据类型
自定义类型: class/struct/union、自己定义的类型
自定义类型的尽头还是内置类型
编译器自动生成的构造函数,对于内置类型成员变量不做处理(可处理,可不处理,看编译器),对于自定义类型成员才会调用无参构造👇(没有无参构造会报错)。
不传参就可以调用那个构造
默认构造函数: 不传参就可以调用的函数就是默认构造函数。
无参的构造函数和全缺省的构造函数都成为默认构造函数,并且默认构造函数只能有一个。
注意:无参构造函数、全缺省构造函数、编译器默认生成的构造函数,都可以认为是默认构造函数.
全缺省构造函数👇
总结:
1.一般情况构造函数都需要我们自己显示的去实现。
2.只有少数情况下可以让编译器自动生成构造函数。(类似MyQuee,类型全是自定义类型)
3.C++11中对内置类型做了调整,在内置类型声明处,用全缺省值给其赋值。
4.拷贝构造
4.1特征:
1.拷贝构造函数是构造函数的一个重载形式
2.参数只有一个是类的类型对象的引用。
a.拷贝构造函数也是一构造函数,因此不能有返回值
b.该函数参数是自身类型的对象的引用
c.自动生成的缺省拷贝构造函数,作为该类的公有成员,否则无法进行默认的拷贝构造
3.拷贝构造通过创建临时对象来返回值。临时对象具有常性。一说到常性,就必须了解权限的放大和缩小。(待放链接)
4.拷贝构造函数是给未定义的对象拷贝构造。
注意:拷贝构造是给未定义的对象。
函数传参自定义类型时,要调用拷贝构造👇👇👇,Date d(d2)
func先调用func函数,然后传参拷贝构造Date d(d2),调用Data构造函数,调完返回。
如果拷贝构造时我们不用引用,去掉&会怎么样。👇👇👇
4.2写法:
Data d(d1);
Data d2 = d3;
4.3浅拷贝和深拷贝
如果没有自定义赋值构造函数,则系统会创建默认的赋值构造函数,但系统创建的默认复制构造函数只会执行“浅拷贝”,即将被拷贝对象的数据成员的值一一赋值给新创建的对象,若该类的数据成员中有指针成员,则会使得新的对象的指针所指向的地址与被拷贝对象的指针所指向的地址相同,delete该指针时则会导致两次重复delete而出错。
浅拷贝:按字节一个一个拷贝,size和capacity拷贝没问题,但array是指针,指向栈顶,st1和st2公用一个空间,会析构两次。
默认拷贝:值拷贝(一次拷贝过来)也就是浅拷贝。
总结:
1、如果没有管理资源,一般情况不需要写拷贝构造,默认生成的拷贝构造就可以。
2、如果都是自定义类型成员,内置类型成员没有指向资源,也类似默认生成的拷贝构造就可以。
3、一般情况下,不需要显示写析构函数,就不需要写拷贝构造
4、如果内部有指针或一些值指向资源,需要显示写析构释放,通常就需要写构造完成深拷贝。如Satck Queue List
5.运算符重载
让自定义类型可以用运算符,并且控制运算符的行为,增强可读性。
·operator+操作符构成函数名
·返回值:得看操作符是声明类型(Date类)
·关键字operator后面接需要重载的运算符符号。
·不能通过连接其他符号来创建新的操作符:比如operator@
·重载操作符必须有一个类类型参数(类的类型的数据)
·用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
·作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
.* :: sizeof ?: . 注意以上5个运算符不能重载。这个经常在笔试选择题中出现
.* :: 域作用限定符, ?: 三目操作符 . 对象.成员名
6.&运算符重载和const成员
将 const 修饰的类成员函数称之为 const 成员函数,const修饰类成员函数,实际修饰该成员函数 隐含的 this 指针,表明在该成员函数中 不能对类的任何成员进行修改。
我们知道this应该是 Date *const this 此时this指向不可变
修饰之后应该是 const Date* const this 此时this指向的值也不可改变
6.1权限问题
权限只能缩小、平移,不能放大。👆👆👆
所以需要加const来保证逻辑闭环。
Date类中是否加const修饰
6.2取地址及const取地址操作符重载
这两个默认成员函数一般不用重新定义 ,编译器默认会生成。
last but not least,创作不易,望读者三连三连三连支持💖
重要的事情说三遍💖