携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情
C++中的构造/析构函数
C++中一个非常重要的概念就是“类”。每个类其实就是一个变量与函数的集合。在C++中为了保持对C的兼容,结构体struct被认为是一种特殊的类,它的成员变量可见性默认是public,也可以有自己的成员函数。关于可见性这一块后面会再展开进行介绍。
在每个类的成员函数中,有两大类函数比较重要:一类是构造函数,另一类是析构函数。之所以说是一类而不是一个,原因主要是构造函数可以有不止一个,这个是由于C++具有重载(overload)的特性,可以区分入参不同的同名函数。C++中的构造函数的调用是时机是在类实例创建时,这里可能有以下两种方式:
一种是创建一个简单的类实例,也就是一个对象:
class A {
public:
A() {}
A(int i) {}
~A() {}
}
A a1;
A a2(1);
上面代码中的A a1其实就隐式地完成了一个无参构造函数的调用,A a2(1)则显式地完成了一个有参构造函数的调用。
还有一种是创建一个类实例的指针:
A* a3 = new A;
A* a4 = new A(1);
上面这段代码其实和第一种调用时机类似,但是使用的是new关键字,创建的也是指针。
C++的一个类中有几种默认的构造函数:
无参构造函数(又叫默认构造函数)
A() {}
初始化构造函数
A(int x, int y) {}
拷贝构造函数
A(const A& a) {}
移动构造函数
A(A&& a) {}
其中构造函数又涉及到explicit关键字,这个关键字的作用是防止无参构造函数与有一个缺省参数的初始化构造函数产生混淆、造成二义性。因为后者可以产生隐式类型转换的效果,造成开发者的判断失误。