类和对象/对象特性/构造函数和析构函数(1)

情景:对象的初始化和清理是两个非常重要的安全问题

1.构造函数完成初始化,析构函数完成请理

2.两者可以都不用写,编译器会帮我们实现一个空实现的构造和析构

3.无须手动调用

构造函数:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Person
 5 {
 6 public:
 7     //1.1构造函数
 8     //可以有参数,可以发生重载
 9     Person()
10     {
11         cout << "Person构造函数的调用" << endl;
12     }
13     //2.1析构函数
14 };
15 
16 void test_01(void)
17 {
18     Person p;//只要实例化,构造函数就会自动调用
19 }
20 
21 int main(void)
22 {
23     test_01();
24 
25     system("pause");
26     return 0;
27 }

析构函数:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Person
 5 {
 6 public:
 7     //1.1构造函数
 8     //可以有参数,可以发生重载
 9     Person()
10     {
11         cout << "Person构造函数的调用" << endl;
12     }
13 
14     //2.1析构函数
15     //析构函数是不可以有参数的,所以不能发生重载
16     //对象在销毁之前会自动调用析构函数
17     ~Person()
18     {
19         cout << "Person析构函数的调用" << endl;
20     }
21 
22 };
23 
24 void test_01(void)
25 {
26     Person p;//在栈上的数据,test_01执行完毕之后,释放这个对象
27 }
28 
29 int main(void)
30 {
31     test_01();
32 
33     system("pause");
34     return 0;
35 }

问题:我们现在将 Person p;放在main函数里面,结果会发生什么?

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Person
 5 {
 6 public:
 7     //1.1构造函数
 8     //可以有参数,可以发生重载
 9     Person()
10     {
11         cout << "Person构造函数的调用" << endl;
12     }
13 
14     //2.1析构函数
15     //析构函数是不可以有参数的,所以不能发生重载
16     //对象在销毁之前会自动调用析构函数
17     ~Person()
18     {
19         cout << "Person析构函数的调用" << endl;
20     }
21 
22 };
23 
24 void test_01(void)
25 {
26     Person p;//在栈上的数据,test_01执行完毕之后,释放这个对象
27 }
28 
29 int main(void)
30 {
31     //test_01();
32 
33     Person p;
34 
35     system("pause");
36     return 0;
37 }

观察:

 

 

 结果发现析构函数没有被调用,说明对象还没有被销毁!程序还没有结束!

1 int main(void)
2 {
3     //test_01();
4 
5     Person p;
6 
7     system("pause");//执行完Person p;之后,程序会暂停在这里,等待我们按下任意键结束。当我们按下任意键,执行完return 0之后,程序即将销毁,在此之前,会调用析构函数。
8     return 0;
9 }

 

posted @ 2020-04-11 11:04  坦率  阅读(197)  评论(0编辑  收藏  举报