类和对象/对象特性/构造函数和析构函数(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 }