1.构造函数
类的创建者可以通过提供一个叫做构造函数的特殊函数,来保证每个对象都被初始化。如果一个类有构造函数,编译器在创建对象的时候就会自动调用这个函数。
从上面的例子我们可以看出,构造函数和类同名,没有返回值,另外的,构造函数还可以重载。
在这个例子中,Date(int y,int m, int d);是类Date的构造函数,在类中给出声明以后,随后的下面给出定义。然后在主函数创建类的实例的时候,Date date (2005,7,5)通过调用构造函数完成了类的初始化。
对于默认构造函数,如果在定义某个类的时候没有显式的定义任何构造函数,那么编译器就会为这个类提供默认构造函数。他是不带参数的构造函数。例如下图:
左侧和右侧完全相等,也就是,用户没有显式地定义任何构造函数,那么编译器就会自动生成一个默认构造函数,也就是不含任何参数的A(){}
在上面的例子中,A是嵌套在B的内部的,所以我们在B b;的时候首先会初始化A,调用A的默认构造函数A(),然后再调用B的默认构造函数B(),所以会打印出A()和B()
2.析构函数
在C++中,清理和初始化同样重要
一个析构函数可以清除和释放资源。析构函数通过补码符号~和类名来标识,没有参数、没有返回值、不可以被重载。
例如,在Date(2022,3,7),tomorrow(200,3,8);首先调用了构造函数,在调用完一部分成员函数后,到达了类的作用域的末端,因此,编译器自动调用了析构函数来释放资源。
类似的,如果我们不在类中显示地写出析构函数,编译器会自动地认为类中有析构函数。
类似的,对于嵌套的类,首先调用的是外部的类的析构函数,其次再是内部的类。这一点和构造函数相反。可以这样想,把嵌套的类看做箱子装箱子,要想构造一个箱子装箱子,首先要有一个小箱子,也就是率先构造内部类,而对于破坏一个箱子套箱子的结构,首先要破坏的是外部的箱子,也就是率先调用外部的析构函数。
再看这个例子,在循坏体内部,首先调用了e0的构造函数,所以先打印 0is created,随后,使用了create_example(1)调用了e1的构造函数,并且打印出functionis over,伴随着这个create_example函数的结束,e1的作用域结束,调用析构函数销毁,打印出1is destroyed,随后,伴随着这一次循坏结束e(0)也到达作用域末端,调用析构函数销毁。
总结
1.构造函数
2.析构函数