C++构造函数和析构函数
有这么一段代码,
classPerson{private:char*name;charage;public:voidSetName(char*name){this->name=name;}intSetAge(charage){this->age=age;return1;}};Personperson;person.SetName("chentong");person.SetAge(20);
我想要初始化成员变量,那么我就得每次通过类变量调用成员函数来实现,这样做当然可以,不过比较麻烦,为了解决这个麻烦,C++引入了构造函数这样一个概念。什么是构造函数?与类名相同的函数,叫做构造函数。构造函数可以有多个,如何区分?通过参数列表的不同来区分。若是我们没有自己写构造函数,那么,系统会自动调用默认构造函数。但是,如果我们自己实现了构造函数,系统就不会再调用默认构造函数了。代码如下,
classPerson{private:char*name;charage;public:voidSetName(char*name){this->name=name;}intSetAge(charage){this->age=age;return1;}voidPerson(){}voidPerson(char*name,charage){this->name=name;this->age=age;}};
那么我们想要初始化变量,只要,
Personperson("chentong",20);
这样,只要调用一次构造函数就对所有成员进行了设置。
那么,调用不带参数的构造函数,如下:
Personperson1;
这样就是调用了不带参数的构造函数而不能写成这样,
Personperson1();
因为,这样写的意义是,声明一个函数。因为,这样写,就相当于,int fac(); //函数的声明。顺带说一句,自己重写构造函数后,一定要写一个不带参数的构造函数,否则编译无法通过。
通过指针访问
Person*person1=newPerson;Person*person2=newPerson();//Person1和Person2的作用完全一样,都会调用无参构造函数Person*person3=newPerson[2];Person*person4=newPerson("chentong",20);
释放内存
deleteperson1;deleteperson2;delete[]person3;deleteperson4;
有如下代码:
classPerson{private:char*name;charage;char*job;public:voidSetName(char*name){this->name=name;}intSetAge(charage){this->age=age;return1;}voidSetJob(char*job){this->job=job;}voidPerson(){}voidPerson(char*name,charage,char*job){this->name=newchar[strlen(name)+1];strcpy(this->name,name);this->age=age;this->job=newchar[stlren(job)+1];strcpy(this->job,job);}voidPerson(char*name,charage,char*job="none"){//this->name=name;this->name=newchar[strlen[name+1];strcpy(this->name,name);this->age=age;//this->job=job;this->job=newchar[strlen[name+1];strcpy(this->job,job);}};
这段代码通过new动态申请空间,来存放数据。C++中,new用来动态申请空间,delete用来释放动态申请的空间。那么C中的malloc()和C++中的new有什么区别呢?它们都能用来动态的申请空间,malloc申请的空间,如果不去主动释放,那么被申请的空间将一直不会释放,这样就会造成内存的浪费。而new动态申请的空间,在程序执行时不会释放,直到程序执行完毕,动态申请的空间才会被释放。如果想要在空间使用完毕后就释放,只要通过delete就可以做到了。
很明显,我们可以把释放空间的代码写成一个函数,当空间使用完毕后,直接调用释放函数,空间就可以被释放了。如果动态申请的空间比较多,可能会出现遗漏释放的情况,所以,为了避免这种情况出现,C++引入了析构函数这样一个概念。当动态空间使用完毕后,析构函数会自动别调用,这样以来,空间就被释放了。析构函数和构造函数类似,都是与类名相同,只不过是,在类名之前加了一个波浪线~。顺带一提,构造函数和析构函数都没有返回值类型。代码如下:
classPeople{private:char*name;charage;char*job;public:voidSetName(char*name){this->name=newchar[strlen(name)+1];strcpy(this->name,name);}intSetAge(charage){if(age>150||age<0){age=0;return-1;}this->age=age;}voidSetJob(char*job){this->job=newchar[strlen(job)+1];strcpy(this->job,job);}voidPrintInfo(){cout<<"name="<<this->name<<",age="<<this->age<<",job="<<this->job<<endl;}People(){this->name=NULL;this->job=NULL;}People(char*name,charage,char*job){this->name=newchar[strlen(name)+1];strcpy(this->name,name);this->age=age;this->job=newchar[strlen(job)+1];strcpy(this->job,job);}~People(){if(this->name!=NULL)deletethis->name;if(this->job!=NULL)deletethis->job;}};
这里的~People()就是析构函数。当程序执行完毕后,析构函数会自动被调用。动态申请的空间就被释放了。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。