一、构造函数和析构函数的特点
- 构造函数和析构函数是一种特殊的公有成员函数,每一个类都有一个默认的构造函数和析构函数;
- 构造函数在类定义时由系统自动调用,析构函数在类被销毁时由系统自动调用;
- 构造函数的名称和类名相同,一个类可以有多个构造函数,只能有一个析构函数。不同的构造函数之间通过参数个数和参数类型来区分;
- 我们可以在构造函数中给类分配资源,在类的析构函数中释放对应的资源。
二、不带参数的构造函数
C++类在创建时,系统会默认创建一个不带参数的构造函数,我们可以重新定义这个构造函数。默认构造函数在类被创建时自动调用,,定义的类在main函数返回后被销毁,此时系统会自动调用析构函数,回收分配给类的资源。
class Person{public:int age;Person();~Person();private:int weight;protected:int hight;};Person::Person()//重定义默认构造函数{cout << "constructor!" << endl;}Person::~Person()//重定义默认析构函数{cout << "destructor!" << endl;}int main(){class Person person;//定义类后系统自动调用构造函数return 0;//函数返回,类被销毁,系统自动调用析构函数}
QT执行结果:
三、构造函数的使用
构造函数的名称必须和类名相同,一个类中可以有多个构造函数,不同的构造函数之间通过参数的类型和参数的个数来区分,系统会根据初始化时传入的参数类型和个数决定执行哪个构造函数。
class Person{public:int age;Person();Person(int flag);Person(int flag0,int flag1);Person(char flag);~Person();private:int weight;protected:int hight;};Person::Person(){20728cout << "constructor!" << endl;}Person::Person(int flag){cout << "constructor int!" << flag << endl;}Person::Person(int flag0,int flag1){cout << "constructor int!" << flag0 <<" "<<flag1<< endl;}Person::Person(char flag){cout << "constructor char!" << flag << endl;}Person::~Person(){cout << "destructor!" << endl;}int main(){class Person person;//执行 Person();class Person person1('c');//执行 Person(char flag);class Person person2(100);//执行Person(int flag);class Person person3(100,200);//执行Person(int flag0,int flag1);cout << "Hello World!" << endl;return 0;}
QT执行结果:
四、使用构造函数初始化类的成员
- 类的构造函数可以直接访问类内部的所有成员,可以通过构造函数初始化类的成员。
- 类成员的初始化方式有两种,第一种是直接在构造函数中给变量赋值,第二种是使用类似于类成员引用的方式初始化。
方式一:
Person::Person(int ag,int we,int hi){age = ag;weight = we;hight = hi;cout << "age:!" << age <<" weight:"<<weight<<" hight:"<<hight<< endl;}
方式二:
Person::Person(int ag,int we,int hi):age(ag),weight(we),hight(hi){cout << "age:!" << age <<" weight:"<<weight<<" hight:"<<hight<< endl;}
五、带默认参数的构造函数
我们在类中定义如下构造函数:
class Person{public:int age;Person(int we,int hi);//和下面的构造函数会产生歧义,故两者只能存在一个Person(int we,int hi,int ag=10);};
- Persion函数的最后一个参数ag的值默认为10,这种就是带默认参数的构造函数。构造函数的默认参数必须位于函数参数的最右边,否则编译器会报错。
- 带默认参数的构造函数不能和具有相同类型相同个数的可变参数的其它构造函数同时存在,否则会产生歧义,编译器也会报错。