其他分享
首页 > 其他分享> > 构造函数与析构函数

构造函数与析构函数

作者:互联网

一、构造函数
构造函数是一种特殊的成员函数,主要用于为对象分配空间,进行初始化。它的名字必须与类名相同,不能任意命名。它可以有任意类型的参数,但不能具有返回值。
为类Score定义一个构造函数:

class Score{
	public:
		Score(int m,int f);  //声明构造函数Score()的原型
		void setScore(int m,int f);
		void showScore();
	private:
		int mid_exam;
		int fin_exam;		
}; 
Score::Score(int m,int f)   //定义构造函数Score()
{
	cout<<"构造函数使用中..."<<endl;
	mid_exam=m;
	fin_exam=f;
}

建立对象的同时用构造函数给数据成员赋初值,例:

#include<iostream>
using namespace std;
class score{
	public:
		score(int m,int f);  //声明构造函数score() 
		void setscore(int m,int f); 
		void showscore();
	private:
		int mid_exam;      //私有数据成员 
		int fin_exam;
};
score::score(int m,int f)  //定义构造函数score() 
{
	cout<<"构造函数使用中..."<<endl;
	mid_exam=m;
    fin_exam=f;
}
void score::setscore(int m,int f)
{
	mid_exam=m;
	fin_exam=f;
}
inline void score::showscore() //在类外定义此函数为内联函数 
{
	cout<<"\n期中成绩:"<<mid_exam<<"\n期末成绩:"<<fin_exam<<"\n";
	cout<<"总评成绩:"<<(int)(0.3*mid_exam+0.7*fin_exam)<<endl; 
}
int main()
{
	score score1(80,88);  //定义类score的对象score1,自动调用构造函数,并给对象score1的数据赋初值 
	cout<<endl<<"成绩输出:";
	score1.showscore();  //定义成员函数showscore(),显示score1的数据 
	score1.setscore(90,92);
	cout<<endl<<"成绩输出:";
	score1.showscore();
	return 0;
}

还有一种使用new运算符动态建立对象的方式
将上面代码的主函数改成如下所示:

int main()
{
	score *pscore;
	pscore=new score(80,88);
	cout<<endl<<"成绩输出:";
	pscore->showscore();
	pscore->setscore(90,92);
	cout<<endl<<"成绩输出:";
	pscore->showscore();
	delete pscore;
	return 0; 
 } 

注意:
①构造函数的名字和类名必须相同,否则编译程序会把它当作一般的成员函数来处理。
②构造函数没有返回值,在定义构造函数时不能说明他的类型,void也不行。
③构造函数的函数体可以写在类体内,也可以写在类体外,与普通的成员函数一样,当构造函数直接定义在类内时,系统将构造函数作为内联函数处理。
④构造函数可以不带参数。
二、析构函数
析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤销对象时的一些清理任务,如释放分配给对象的内存空间等。有以下特点:
①析构函数和构造函数名字相同,但它前面必须加一个波浪号(~)
②析构函数没有参数,也没有返回值,而且不能重载。因此一个类中只能有一个析构函数。
③撤销对象时,系统自动调用析构函数。

#include<iostream>
#include<string.h>
using namespace std;
class student{
	public:
		student(char *name1,char *stu_no1,float score1); //声明构造函数 
		~student();    //声明析构函数 
		void modify(float score1);  //成员函数,修改数据 
		void show();    //成员函数,显示数据 
	private:
		char *name;     //学生姓名 
		char *stu_no;   //学生学号 
		float score;    //学生成绩 
};
student::student(char *name1,char *stu_no1,float score1)  //定义构造函数 
{
	name=new char[strlen(name1)+1];  //strlen(name1)+1防止溢出
	strcpy(name,name1);
	stu_no=new char[strlen(stu_no1)+1];
	strcpy(stu_no,stu_no1); 
	score=score1;
 }  
student::~student()   //定义析构函数 
{
	delete []name;
	delete []stu_no;
}
void student::modify(float score1)
{
	score=score1;
}
void student::show()
{
	cout<<"姓名:"<<name<<endl;
	cout<<"学号:"<<stu_no<<endl;
	cout<<"分数:"<<score<<endl; 
}
int main()
{
	student stu1("黎明","20150201",90);  //定义student的对象stu1 调用构造函数初始化stu1 
	stu1.show();   //调用成员函数show()显示stu1的数据 
	stu1.modify(88);  //调用成员函数修改stu1的数据 
	cout<<"修改后:"<<endl;
	stu1.show();  //显示stu1的数据 
}

当程序结束,对象撤销时,调用了析构函数,释放由new分配的内存空间。

在以下情况,对象将被撤消,编译系统也会自动地调用析构函数:
① 主程序main()运行结束。
② 如果一个对象被定义在一个函数体内,则当这个函数结束时,该对象的析构函数被自动调用。
③ 若一个对象是使用new运算符动态创建的,在使用delete运算符释放它时,delete会自动调用析构函数。

标签:函数,int,与析构,void,score,析构,构造函数
来源: https://blog.csdn.net/m0_52671984/article/details/115186235