今天我同事问我,析构函数里什么都不写,那要它来干什么呢?咋一想彷佛是没什么做用哦,就是一个空函数而已。后来想想不对。下面请让我细细道来。ios
首先说一下对象的生命周期。对象在声明或new时被建立,在离开做用域时被销毁。在建立时,调用自身的构造函数;在销毁时调用析构函数。编程
因此有时候会有这样的错误的认识:对象是调用构造函数建立的,在调用析构函数时被销毁的。这种想法也就是前文提到的。ide
实际上,对象建立的过程是这样的:函数
1.根据类的大小分配一块内存this
2.调用构造函数对这块内存进行初期化spa
对象销毁的过程是这样的:code
1.调用析构函数执行清理工做对象
2.销毁内存blog
因此对象建立与构造函数无关,对象销毁时与析构函数无关(假设,构造函数与析构函数都承诺不抛出异常)。生命周期
为了验证上面所述来看一个例子。
1 using namespace std; 2 #include <iostream> 3 4 class Foo{ 5 public: 6 Foo(){ 7 cout << &(*this) << endl; 8 } 9 ~Foo(){ 10 } 11 void PrintHello(){ 12 cout<< "hello"<<endl; 13 } 14 }; 15 void main(){ 16 17 Foo foo; 18 foo.~Foo(); 19 foo.PrintHello(); 20 21 }
第7行的输出结果是“C6F7AF”,而PrintHello函数的调用仍然是能够的。
补充一下构造函数和析构函数的特色(摘自互联网)。
构造函数
(1)构造方法的方法名必须与类名相同。
(2)构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
(3)构造方法的主要做用是完成对象的初始化工做,它可以把定义对象时的参数传给对象的域。
(4)构造方法不能由编程人员调用,而要系统调用。
(5)一个类能够定义多个构造方法,若是在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。
(6)构造方法能够重载,以参数的个数,类型,或排列顺序区分
析构函数析构函数(destructor)也是一种成员函数,但它的做用与构造函数相反,
用来在系统释放对象前作一些清理工做,如利用delete运算符释放临时分配的内存,
清零某些内存单元等.当一个对象生存期结束时,系统会自动调用该对象所属类的析构函数;
构造函数的名称与类名相同,而析构函数的名称必须在类名前加上"~"符号;
注意,构造函数和析构函数不能指定任何返回值类型,包括void返回类型;