C+±学习记录-面向对象-构造函数和析构函数

0.重要性

对象的初始化和清理十分重要。如果对象没有初始化,使用的后果是未知。如果对象没有及时清理也会有问题。C++使用了构造函数和析构函数来解决这个问题。

构造函数和析构函数由编译器调用,不可手动调用。

1.构造函数 类名(参数){}

1.在类里面,构造函数一定要有,如果没有编译器会生成一个空的

2.构造函数用来给对象的成员属性赋值,初始化。在程序调用对象时会且只会调用一次

3.构造函数可以传入参数,因此可以发生重载。

4.函数名和类名相同。

5.构造函数没有返回值也不写void

2.析构函数 ~类名(){}

1.在类里面,析构函数一定要有,如果没有编译器会生成一个空的

2.析构函数用来执行一些清理操作,在对象销毁前由程序调用且只会调用一次

3.析构函数不可以有参数,因此不可以发生重载

4.函数名和类名相同,前面加上~

5.析构函数没有返回值也不写void

3.练习一下

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
class charactor {
public:
string name;
public:
charactor(string n) { name = n; cout << "构造函数被调用" << endl;}//构造函数

~charactor()
{
cout << "析构函数被调用" << endl;
}//析构函数

};//创建一个类

void test()
{
charactor sllh("神里绫华");
}//初始化对象


int main()
{
test();//调用函数,初始化对象
system("pause");
return 0;
}

运行结果:

1
2
3
构造函数被调用
析构函数被调用
请按任意键继续. . .

若在main函数中初始化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class charactor {
public:
string name;
public:
charactor(string n) { name = n; cout << "构造函数被调用" << endl;}//构造函数

~charactor()
{
cout << "析构函数被调用" << endl;
}//析构函数

};//创建一个类


int main()
{
charactor sllh("神里绫华");//初始化对象
system("pause");
return 0;
}

运行结果:

1
2
构造函数被调用
请按任意键继续. . .

此时按下任意键,会有:

1
2
3
4
5
6
7
构造函数被调用
请按任意键继续. . .
析构函数被调用

D:\Work\C艹练习\练手\Project1\Debug\Project1.exe (进程 35528)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

在main函数中调用对象结束后,程序先执行了system(“pause”)

一些冷知识

1.类中的构造函数和析构函数可以在类内声明,写在类外,注意访问权限不能为private,protected访问权限不影响类外实现

2.类外实现语法: 类名::构造/析构函数名(){ }

3.析构函数尽量写为public

示例:

1
2
3
4
5
6
7
8
9
class charactor {
public:
string name;
public:
charactor(string n);
~charactor();
};
charactor::charactor(string n) { name = n; }
charactor::~charactor(){ cout << "析构函数被调用" << endl; }

3.构造函数初始化列表的另一种写法: 类名::构造函数名(参数列表):变量名(值),变量名(值){}

示例:

1
2
3
4
5
6
7
8
9
10
11
12
class charactor {
public:
string name;
public:
charactor(string n);
~charactor();
};

charactor::charactor(string n):name(n)//另一种初始化方法
{
cout << "构造函数被调用" << endl;
}

4.构造函数和析构函数都不能被继承