目录
this指针
构造函数
析构函数
this指针
在我们创建一个对象,对象去调用类中的函数的时候,有没有想过它是怎么进行修改的,回想我们以前写C语言的时候,如果我们写了一个栈,当需要操作栈中的数据时,我们需要把构造出来栈的变量的地址传过去,让函数拿到这个地址来对我们的栈进行出去操作。
看着样子就像是一个是手动挡,一个是自动挡。手动档需要我们自己去换档,而自动挡帮我们完成了这一操作,只需要踩油门就可以了。
可到了C++当我们需要调用一个函数来实现某个功能的时候只只需要传我们需要插入或者删除的数字就可以,那么它是怎么做到的呢?这其实归功于我们的this指针,祖师爷当时在创造c++的时候,发现改变结构体需要传入结构体的指针,每次都要进行一个重复的操作区传它的地址,既然每次都要我自己去传,倒不如我帮你直接传了。那么this指针是存在哪里的呢,在VS2019下,编译器对this进行了优化,把对象的地址存放在了寄存器exc里面,而exc里面存放的额就是this的值啦。
那么我们再来看一点,this指针可以为空吗,先来看两个比较
为什么这里不会报错呢。其实在A调用print的时候不会发生解引用,因为print的地址不在对象中,A会作为实参传递给thi指针,this指针此时为空,但是在内部并没有对空指针进行解引用。所以就不会报错。
那么我们继续看第二个题型
这里会崩溃就是我们在对一个空的指针进行解引用。那为什么不可以在参数列表显示this指针呢,因为它是成员函数的第一个隐含的指针形参。如果你确实想让它显示传递可以手动定义一个指针类型的参数,将this指针赋值给它,但是这样岂不是多此一举了吗。
构造函数
大家有没有想过,在我们写C语言的时候偶尔会忘记初始化呢?而在C++里面就完全不用担心,因为我们的祖师爷在创造C++的时候同可能同样也遇到过这个问题,那么一想,反正写出来都要初始化,那我直接帮你初始化就行了。所以一个构造函数就由此诞生了。
我们先来了解一下什么是构造函数已经构造函数有哪些结构
1:构造函数是一个特殊的成员函数,虽然它名字叫构造函数,但他的功能其实并不是开空间创造对象,而是完成对对象的初始化
2:构造函数与类名相同。
3:构造函数没有返回值
4:构造函数可以重载
5:如果类中没有定义构造函数,那么c++编译器会自动生成一个构造函数,如果用户显示定义了编译器就不会在生成了。
6:无参的构造函数和全缺省的构造函数都称为默认构造函数并且构造函数只能有一个。
那么我先看第一点,入如介绍一样,构造函数时一个特殊的构造函数,但是它的功能不是去构造一个一快空间,而是对对象初始化。怎么说呢,就是当我们定义一个类实例化之后,这个对象会去调用构造函数,对对象中的成员进行初始化,但值得注意的一点是,当时祖师爷在设计构造函数的时候留下了一个坑,那就是内置类型不会对它经行初始化。(编译器有两种类型,内置类型/基本类型(int,double,long....指针),自定义类型(用户自己定义的类型,如struct/class))。
我们这里也确实可以看到,在调用了date的构造函数之后a,b,c的值是随机值,所以我们在有内置类型的时候尽量自己去写构造函数。
大家觉得构造函数因该把他初始化成0,但是却没有这样干,所以说这是祖师爷留下的一个坑,但也会有人说为什么后面不改一下让它初始化成0呢,因为可能有些人用的就是这个随机值,如果修改了的话可能用这些随机值的公司就要怨气满腹了。后来呢在C++11标准发布的时候打了一个补丁在成员申明的时候可以给缺省值,但是要记住这不是初始化,这是在告诉编译器,你生成构造函数的时候可以用我给的这个值。
根据上面的我们可以反射知道构造函数其实也可以指定带参数的,但是如果要带参数而对象没有传参数就会报错。
我们在让构造函数带指定参数的时候同样最好也把它全部写成全缺省的参数,方便我们对象后续的调用,如果写半缺省(加入缺省一个参数)的话那么在对象传参的时候就必须要传一个参数,否者就会报错
所以当我们要去写一个构造函数的时候最好把它写成全缺省参数,如果我们不需要用它就可以手动把对象的成员全部初始化成0。
析构函数
接下来我们看看析构函数,了解一下它的概念
1:析构函数和构造函数的功能相反,析构函数不是完成对对象本身的销毁,局部对象的销毁是由编译器完成的,而对象在销毁时会自动调用析构函数,完成对对象中的资源销毁工作
2:析构函数是类名前面加一个~
3:无参数无返回类型
4:一个类只有一个析构函数,若没有写的话则由系统自动调用
5:对象生命周期结束的时候,c++编译器会自己调用析构函数
我们定义了一个对象,这个对象是存在栈帧中的,当我们去调用这个析构函数的时候不是说直接把对象销毁了,对象是在结束的时候由编译器去销毁的,而构造函数只是把对象中所占用的资源归还贵操作系统。