什么是构造函数和析构函数
构造函数和析构函数是类中的一个重要属性,它的存在是为了做类的初始化等工作,可以把我们买的电子产品想作一个类,那么构造函数就是用来第一次开机去做一些系统配置的作用,之后就再也不用配置了,析构函数像是恢复默认出厂设置的作用。
在实例化一个对象的时候,constructor会自动执行,当这个对象结束生命周期后,会自动执行destructor,假如程序员没有进行这俩个函数的编写,编译器会默认生成这俩个函数的空实现,当程序员进行编写后,则会执行自定义的函数,代码和结果如下图:
上节学习基础的类与对象时提了一嘴重载,重载是c++中的一个重要特性,具体是同一个函数名,不同的参数类型、不同的参数个数,不同的参数顺序都会认为他是一个新函数,具体有什么作用在后面的学习再展开,说这个概念是为了介绍下面构造函数的重载。
普通构造函数和拷贝构造函数
总览:
#include <iostream>
using namespace std;
class Code
{
public:
Code()
{
cout << "已执行构造函数" << endl;
}
Code(int var)
{
cout << "已执行int参的构造函数" << endl;
}
Code(double var)
{
cout << "已执行double参的构造函数" << endl;
}
Code(int var, double var1)
{
cout << "已执行双参的构造函数" << endl;
}
Code(const Code &code)
{
cout << "已执行拷贝构造函数" << endl;
}
~Code()
{
cout << "已执行析构函数" << endl;
}
private:
};
int main(void)
{
Code code;
Code code1(10);
Code code2(1.2);
Code code3(1, 5.5);
Code code4(code3);
}
执行结果:
在上面的代码中我分别写了5个构造函数,它们正是利用了重载这一特性,例如当你想让它执行double参的构造函数时,在实例化类的时候就用第37行的代码。
拷贝构造函数
重点说一下什么是拷贝构造函数
首先如果你要写一个自定义的构造函数,那前提必须要把默认的构造函数写上,否则如下图:
拷贝构造函数的定义方式如上代码11行,用引用的方式访问这个对象的本身并且不能对这个对象更改,这里应该很好理解,像c中的strcpy那样的函数src总是const的,防止程序员中途进行修改,这里同理。
接下来看看拷贝构造函数有什么神奇之处
如图,30行的c对象调用了参数为字符串的构造函数,关键在于第31行,此时c1.fav_code居然也变成了cplusplus,这就是拷贝构造的作用,将c对象的值拷贝给了c1。
再看一种神奇的拷贝构造函数的应用:
此时发现当执行26行时打印了<已执行拷贝构造函数>,这是为什么呢?回忆一下函数的形参是不是实参的一个拷贝?这么说你就明白了,其实就是test()的形参就是拷贝了b1的副本嘛,当然要执行拷贝函数了。