在C++中编辑器会自定义三种函数
分别是构造函数,析构函数,拷贝构造函数
构造函数:为对象的成员属性赋值,构造函数由编译器自动调用 没有返回值也不写void,函数名称与类名相同,可以有参数,可 以发生重载
![](https://img-blog.csdnimg.cn/img_convert/6416b5118e04cc2f8bcd3a00a9f005cf.png)
当我们的属性为私有时,在类外访问不到,想要初始化和修改属性,就需要借助成员函数非常麻烦
当我们使用构造函数时就会很轻松
![](https://img-blog.csdnimg.cn/img_convert/dc1efa59acc56860589de0516ba498c4.png)
构造函数可以进行重载,因为可以有参数,我们也可以通过重载给属性赋值
![](https://img-blog.csdnimg.cn/img_convert/51642d1f8aa8c060ba0bb7a167ef5f2c.png)
系统自定义的默认构造函数只具有一个空的函数体,只要我们调用到类就会调用默认构造函数,并且只调用一次,当我们自定义构造函数,无论是有参还是无参,编辑器都不会再为我们定义默认构造函数
调用默认构造函数时不要加括号,直接实例化对象就会自动调用,加上括号系统会认为这是一个函数声明
![](https://img-blog.csdnimg.cn/img_convert/0df6f793eb68b9902d726d81ff50d2d0.png)
析构函数:在对象销毁前系统自动调用,进行清理,没有返回值 也不用写void,函数名称与类名相同在左名称加~,不可以有参 数不能进行重载
![](https://img-blog.csdnimg.cn/img_convert/3db7cf2e2bc5f0d111d72ef4d7ce9790.png)
![](https://img-blog.csdnimg.cn/img_convert/f66e0ff350db53627cebf1fafff993ae.png)
由上对比可知,第一幅图是在main函数中调用类,所以是在程序运行结束在调用析构函数销毁类
而第二幅图是在test函数中调用类,函数存储在栈区,调用完毕即销毁释放,所以会在此时调用析构函数
以此证明当类销毁时,系统会自动调用析构函数,无论是系统自定义的默认析构函数还是我们自定义的析构函数
析构函数不仅仅只是为了销毁对象,当类属性中带有指针,并且我们想传入数据并将数据存储在堆区中时,我们就需要析构函数有释放堆区的功能,因为堆区是由程序员自己开辟自己手动释放的
![](https://img-blog.csdnimg.cn/img_convert/9a67ed07e1a3b94c5cbf64177d43dbc7.png)
我们需要在析构函数中写一个判断函数来进行堆区的释放,这就是自定义析构函数的作用
拷贝构造:类名(const类名&对象)即Person(const Person&p)
当我们自定义拷贝函数时,系统便不会再提供默认构造函数,包括有参和无参
使用拷贝构造的时机:
1. 使用一个创建完毕的对象来初始化一个新的对象
![](https://img-blog.csdnimg.cn/img_convert/61e858d9ebd8afbf1198af7f9ad8c86b.png)
不仅可以初始化本对象,还可以利用其他类初始化本类
![](https://img-blog.csdnimg.cn/img_convert/e4b3a0e53d5011a2bd52815384ea8056.png)
其本质就是将一个类传递过去进行拷贝,浅拷贝便是赋值操作,自定义的深拷贝由程序员自己定义其作用
2. 值传递的方式给函数参数传值
![](https://img-blog.csdnimg.cn/img_convert/f535a28ca13cc1ba6015d482c79cac36.png)
值传递即系统会拷贝一份临时副本,此时便会自动调用默认拷贝函数
3. 以值方式返回局部对象
![](https://img-blog.csdnimg.cn/img_convert/e2711f052b568a881ce61fd8d22c55b0.png)
同样作为值放回也会调用默认拷贝函数
当利用拷贝函数时还要注意浅拷贝问题,浅拷贝就是默认拷贝,只提供赋值
当浅拷贝对象里有指针存在指向堆区时,浅拷贝只对这个指针赋值,所以只复制了指针,导致两个指针指向同一份堆空间
当我们进行堆区释放时,便会对这份堆区进行重复释放导致非法访问
所以我们需要自定义拷贝函数进行深拷贝解决这类问题
![](https://img-blog.csdnimg.cn/img_convert/138450ba4bbbafd5a6a846c0d7c402b7.png)
![](https://img-blog.csdnimg.cn/img_convert/d96dedbd08457f4aa6dd94bf958638d9.png)
这就是浅拷贝的错误
深拷贝就是把注释的自定义拷贝函数解开
以上就是对构造函数和析构函数的理解