温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++构造函数和析构函数

发布时间:2020-07-14 14:00:50 来源:网络 阅读:674 作者:BarnabyRoss 栏目:编程语言

   有这么一段代码,

class Person{
private:
char* name;
char age;
public:
void SetName ( char* name ){
this->name = name;
}
int SetAge ( char age ){
this->age = age;
return 1;
}

};
Person person;
person.SetName ( "chentong" );
person.SetAge ( 20 );

   我想要初始化成员变量,那么我就得每次通过类变量调用成员函数来实现,这样做当然可以,不过比较麻烦,为了解决这个麻烦,C++引入了构造函数这样一个概念。什么是构造函数?与类名相同的函数,叫做构造函数。构造函数可以有多个,如何区分?通过参数列表的不同来区分。若是我们没有自己写构造函数,那么,系统会自动调用默认构造函数。但是,如果我们自己实现了构造函数,系统就不会再调用默认构造函数了。代码如下,

class Person{
private:
char* name;
char age;
public:
void SetName ( char* name ){
this->name = name;
}
int SetAge ( char age ){
this->age = age;
return 1;
}
void Person ()
{
}
void Person ( char* name, char age ){
this->name = name;
this->age = age;
}
};

   那么我们想要初始化变量,只要,

Person person ( "chentong", 20 );

   这样,只要调用一次构造函数就对所有成员进行了设置。

   那么,调用不带参数的构造函数,如下:

Person person1;

这样就是调用了不带参数的构造函数而不能写成这样,

Person person1();

因为,这样写的意义是,声明一个函数。因为,这样写,就相当于,int fac(); //函数的声明。顺带说一句,自己重写构造函数后,一定要写一个不带参数的构造函数,否则编译无法通过。

   通过指针访问

Person* person1 = new Person;
Person* person2 = new Person(); //Person1和Person2的作用完全一样,都会调用无参构造函数
Person* person3 = new Person [2];
Person* person4 = new Person ( "chentong", 20 );

  释放内存

delete person1;
delete person2;
delete []person3;
delete person4;

   有如下代码:

class Person{
private:
char* name;
char age;
char* job;
public:
void SetName ( char* name ){
this->name = name;
}
int SetAge ( char age ){
this->age = age;
return 1;
}
void SetJob ( char* job ){
this->job = job;
}
void Person(){
}
void Person( char* name, char age, char* job ){
this->name = new char[strlen(name)+1];
strcpy ( this->name, name );
this->age = age;
this->job = new char[stlren(job) + 1];
strcpy ( this->job, job );
}
void Person ( char* name, char age, char* job = "none" ){
//this->name = name;
this->name = new char[strlen[name + 1];
strcpy ( this->name, name );
this->age = age;
//this->job = job;
this->job = new char[strlen[name  + 1];
strcpy ( this->job, job );
}
};

   这段代码通过new动态申请空间,来存放数据。C++中,new用来动态申请空间,delete用来释放动态申请的空间。那么C中的malloc()和C++中的new有什么区别呢?它们都能用来动态的申请空间,malloc申请的空间,如果不去主动释放,那么被申请的空间将一直不会释放,这样就会造成内存的浪费。而new动态申请的空间,在程序执行时不会释放,直到程序执行完毕,动态申请的空间才会被释放。如果想要在空间使用完毕后就释放,只要通过delete就可以做到了。

   很明显,我们可以把释放空间的代码写成一个函数,当空间使用完毕后,直接调用释放函数,空间就可以被释放了。如果动态申请的空间比较多,可能会出现遗漏释放的情况,所以,为了避免这种情况出现,C++引入了析构函数这样一个概念。当动态空间使用完毕后,析构函数会自动别调用,这样以来,空间就被释放了。析构函数和构造函数类似,都是与类名相同,只不过是,在类名之前加了一个波浪线~。顺带一提,构造函数和析构函数都没有返回值类型。代码如下:

class People {

private:
	char* name;
	char age;
	char* job;
public:
	void SetName(char* name) {

		this->name = new char[strlen(name) + 1];
		strcpy(this->name, name);
	}

	int SetAge(char age) {

		if (age > 150 || age < 0) {

			age = 0;
			return -1;
		}
		this->age = age;
	}

	void SetJob(char* job) {

		this->job = new char[strlen(job) + 1];
		strcpy(this->job, job);
	}

	void PrintInfo() {

		cout << "name = " << this->name << ", age = " << this->age << ", job = " << this->job << endl;
	}

	People() {

		this->name = NULL;
		this->job = NULL;
	}

	People(char* name, char age, char* job) {

		this->name = new char[strlen(name) + 1];
		strcpy(this->name, name);
		this->age = age;
		this->job = new char[strlen(job) + 1];
		strcpy(this->job, job);

	}

	~People() {

		if (this->name != NULL)
			delete this->name;
		if (this->job != NULL)
			delete this->job;
	}
};

   这里的~People()就是析构函数。当程序执行完毕后,析构函数会自动被调用。动态申请的空间就被释放了。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI