构造函数和析构函数
构造函数的特性:
1.名字和类名相同。
2.需要声明为 public 属性。否则创建对象时无法被调用。
3.没有返回值。函数体中不能有 return 语句,不管是声明还是定义函数名前都不能出现返回值类型,即使是 void 也不允许。
4.系统在创建对象时自动调用,不需要用户显式调用(用户也不能调用,会报错)。
5.允许重载。一个类可以有多个重载的构造函数,创建对象时根据传递的实参来判断调用哪一个构造函数。
6.如果用户没有定义构造函数,编译器会自动生成一个函数体和形参都为空的构造函数。例:Student(){}。
7.调用没有参数的构造函数或不传参数,不能加括号!!!(不过在Visual Studio据说不会报错)
构造函数的作用:
在创建对象的时候对对象的数据成员进行初始化:
方式一:采用参数初始化表。
方式二:在构造函数的函数体中对成员变量赋值。
使用参数初始化表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简明。
析构函数的特性:
1.名字:~类名。
2.需要声明为 public 属性,否则释放对象时无法被调用。
3.没有返回值。函数体中不能有 return 语句,不管是声明还是定义函数名前都不能出现返回值类型,即使是 void 也不允许。
4.系统在释放对象时自动调用,不需要用户显式调用(用户可以调用,但无需这样做,容易导致程序异常终止)。
5.不允许重载。因此一个类只能有一个析构函数。
6.如果用户没有定义析构函数,编译器会自动生成一个默认的析构函数。
7.析构函数没有参数。
析构函数的作用:
在系统释放对象占用的内存之前进行一些清理工作,把对象所占用的额外空间归还给程序。
#include <iostream> using namespace std; class Student { public: // 方式一:采用参数初始化表 Student(int a, int b) : age(a), score(b) { cout << "调用构造函数" << endl; } // 方式二:在构造函数的函数体中对成员变量赋值 /* Student(int a, int b) { age = a; score = b; cout << "初始化完成" << endl; } */ ~Student() { cout << "调用析构函数" << endl; } void printinfo() { cout << "age : " << age << endl; cout << "score : " << score << endl; } private: int age; int score; }; int main(int argc, char *argv[]) { Student stu(16, 18); stu.printinfo(); return 1; } 输出: 调用构造函数 age : 16 score : 18 调用析构函数