构造函数与析构函数

定义:

在C++中,构造函数和析构函数是用于对象初始化和清理的特殊成员函数。构造函数在对象创建时自动调用,而析构函数在对象销毁前自动调用。

构造函数:

构造函数用于初始化对象的成员变量。它的名称与类名相同,没有返回值(是没有返回值,而不是返回值为空(void))。构造函数可以有参数,也可以没有参数。构造函数可以进行重载,即:一个类可以拥有多个参数列表不同的构造函数。

析构函数:

析构函数在对象销毁前自动调用,名称为~ 类名,与构造函数相同,也没有返回值,一个类只能拥有一个析构函数。

然而,如果对象是动态分配(使用new)的,那么需要在使用完成后手动通过delete进行销毁,而不是依赖对象在作用域结束后的自动析构。

1
2
3
4
5
6
7
8
9
10
11
12
class A
private:
int a;
public:
A(int a){
this->a=a;
cout<<"A is constructed"<<endl;
}
~A(){
cout<<"A is distructed"<<endl;
}
};

使用注意事项:

调用顺序

析构函数的调用顺序与对象的创建顺序相反,这是C++中局部对象生命周期的规则。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;

class A{
string name;
public:
A(string name) {
this->name = name;
cout << "A(" << name << ")" << endl;
}
~A() {
cout << "~A(" << name << ")" << endl;
}
};
int main() {
A a1("a1"), a2("a2");
return 0;
}

该函数的输出为:

1
2
3
4
A(a1)
A(a2)
~A(a2)
~A(a1)

构造函数的重载

可以在以不同的方式进行创建对象的时候调用不同的构造函数,直接上🌰:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;

class A {
private:
int a, b, c;
public:
A() { // 默认构造函数
a = 0;
b = 0;
c = 0;
cout << "A" << endl;
}
A(int a, int b, int c) { // 原来的构造函数
this->a = a;
this->b = b;
this->c = c;
cout << "A" << endl;
}
~A() {
cout << "~A" << endl;
}
};

int main() {
A test; // 使用默认构造函数
A test2(1,2,3);
return 0;
}