构造函数与析构函数

146 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

1、构造函数

顾名思义,当类创建变量时系统会自动调用构造函数,如果程序员不自己写构造函数,系统会自动包含一个无参数的构造函数,当然程序员也可以自己写构造函数,自己设置参数。构造函数可以是内联函数、重载函数、带默认形参值的函数。

//拷贝构造函数,顾名思义,若已经存在一个该类的变量,在创建下一个是与之相同的变量可以直接拷贝,这样更方便,拷贝构造函数常用在函数传参的时候。
CPU(CPU &c){
	rank = c.rank; frequency = c.frequency; voltage = c.voltage;
	cout << "CPU拷贝构造函数调用完毕!" << endl;
}
//程序员自己写的含参构造函数,在创建变量是可以直接为其赋初值
CPU(CPU_Rank r, int f, float v){
	rank = r;
	frequency = f;
	voltage = v;
	cout << "构造了一个 CPU("<< r<<',' << f<<','<<v<<")"<< endl;
}

2、析构函数

析构函数与构造函数是成对存在的,系统每调用一次构造函数创建变量时,都会在这个变量消失前获程序结束之前调用析构函数释放内存。析构函数与构造函数形式非常相似,只需在类名前加上 ~ 即可。

~CPU() {
  cout << "析构了一个 CPU(" //打印一些内容,这样运行时可以观察到系统调用了析构函数
  << GetRank() 
  <<','
  <<GetFrequency()
  <<','
  <<GetVoltage()
  <<')'
  << endl;
}

3、运行解释

image.png 可以观察到,一共有二十个构造函数,二十个析构函数。仔细观察,前六行和最后六行,可以发现他们系统所构造或析构的变量是上下对称的。原因是因为,我们在创建变量时,变量会被保存在栈区,而栈具有“先进后出,后进先出”的特点,所以先构造的变量会最后被析构,而后构造的变量靠近栈顶会先被析构(即内存被释放)。需要注意的是,有些变量(往往会是全局变量)会在整个程序结束之前被析构,而有的局部变量是在某个函数调用完之后,整个程序结束之前被析构。

4、完整代码

#include <iostream>
#include <cstdio>
using namespace std;
typedef int Int;
typedef float Float ;
enum CPU_Rank{P1 = 1, P2, P3, P4, P5, P6, P7};
class CPU
{
private:
	CPU_Rank rank;//等级
	Int frequency;//频率
	Float voltage;//电压
public:
	CPU(CPU &c)
	{
		rank = c.rank; frequency = c.frequency; voltage = c.voltage;
		cout << "CPU拷贝构造函数调用完毕!" << endl;
	}
	CPU(CPU_Rank r, int f, float v)
	{
		rank = r;
		frequency = f;
		voltage = v;
		cout << "构造了一个 CPU("<< r<<',' << f<<','<<v<<")"<< endl;
	}
	~CPU() { cout << "析构了一个 CPU(" << GetRank() <<','<<GetFrequency()<<','<<GetVoltage()<<')'<< endl; }
	CPU_Rank GetRank() const { return rank; }
	Int GetFrequency() const { return frequency; }
	
	Float GetVoltage() const { return voltage; }
	void SetRank(CPU_Rank r) { rank = r; }
	void SetFrequency(int f) { frequency = f; }
	void SetVoltage(float v) { voltage = v; }
	void Run() { cout <<"CPU("<< GetRank() << ',' << GetFrequency() << ',' << GetVoltage() << ')' <<"开始运行!" << endl; }
	void Stop() { cout << "CPU("<<GetRank() << ',' << GetFrequency() << ',' << GetVoltage() << ')' <<" 停止运行!" << endl; }
};

class RAM
{
public:
	RAM(RAM &r)
	{
		neicun = r.neicun;
		zhupin = r.zhupin;
		cout << "RAM拷贝构造函数调用完毕!" << endl;
	}
	RAM(int n,int z);
	~RAM();
	int Getneicun();
	int Getzhupin();
	void Setneicun(int n);
	void Setzhupin(int z);
	void Run();
	void Stop();

private:
	int neicun;//容量 G
	int zhupin;//主频 MHZ
};

RAM::RAM(int n,int z)
{
	neicun = n;
	zhupin = z;
	cout << "构造了一个RAM("<<Getneicun()<<','<<Getzhupin()<<')' << endl;
}

RAM::~RAM()
{
	cout << "析构了一个RAM(" << Getneicun() << ',' << Getzhupin() << ')' << endl;
}

int RAM::Getneicun() { return neicun; }
int RAM::Getzhupin() { return zhupin; }
void RAM::Setneicun(int n) { neicun = n; }
void RAM::Setzhupin(int z) { zhupin = z; }
void RAM::Run() { cout << "RAM(" << Getneicun() << "," << Getzhupin() << ")开始运行!"<< endl; }
void RAM::Stop(){ cout << "RAM(" << Getneicun() << "," << Getzhupin() << ")停止运行!" << endl; }

class CDROM
{
public:
	CDROM(CDROM &cd)//拷贝构造函数
	{
		duqusulv = cd.duqusulv;
		chicun = cd.chicun;
		cout << "CDROM拷贝构造函数调用完毕!" << endl;
	}
	CDROM(float du, int chi);
	~CDROM();
	void Setduqusulv(float du);
	void Setchicun(int chi);
	float Getduqusulv();
	int Getchichun();
	void Run();
	void Stop();

private:
	float duqusulv;//读取速率
	int chicun;//尺寸
};

CDROM::CDROM(float d,int c)
{
	duqusulv = d;
	chicun = c;
	cout << "构造一个CDROM("<<d<<','<< c <<')' << endl;
}
CDROM::~CDROM()
{
	cout << "析构一个CDROM(" << Getduqusulv() << ',' << Getchichun() << ')' << endl;
}
void CDROM::Setduqusulv(float du) { duqusulv = du; }
void CDROM::Setchicun(int chi) { chicun = chi; }
float CDROM::Getduqusulv() { return duqusulv; }
int CDROM::Getchichun() { return chicun; }
void CDROM::Run(){cout<< "CDROM(" << Getduqusulv() << ',' << Getchichun() << ")开始运行!"<< endl;}
void CDROM::Stop(){ cout << "CDROM(" << Getduqusulv() << ',' << Getchichun() << ")停止运行!" << endl; }
class Computer
{
public:
	//Computer();
	Computer(CPU c, RAM r, CDROM cd);//组合构造函数
	Computer(Computer &C);//组合类拷贝构造函数
	~Computer();
	void Run();
	void Stop();

private:
	CPU cpu;
	RAM ram;
	CDROM cdrom;
};
Computer::Computer(Computer &C)
	:cpu(C.cpu), ram(C.ram), cdrom(C.cdrom)
{
	cout << "Computer拷贝构造函数调用完毕" << endl;
}

Computer::Computer(CPU c,RAM r,CDROM cd)
	:cpu(c),ram(r),cdrom(cd)
{
	cpu = c;
	ram = r;
	cdrom = cd;
	cout<<"Computr含参构造函数被调用!" << endl;
}
Computer::~Computer()
{
	cout << "Computr析构函数被调用!" << endl;
}
void Computer::Stop()
{
	cpu.Stop();
	ram.Stop();
	cdrom.Stop();
	cout << "Computer停止运行!" << endl;
}
void Computer::Run() 
{
	cpu.Run();
	ram.Run();
	cdrom.Run();

	cout << "Computer开始运行!" << endl; 
}
void main()
{
	CPU c1(P6, 300, 2.8);
	CPU c2(P1, 400, 2.7);
	RAM r1(64, 4);
	RAM r2(128, 8);
	CDROM cd1(5, 4);
	CDROM cd2(6, 4);
	Computer J1(c1, r1, cd1);
	Computer J2(c2, r2, cd2);
	cout << endl;
	J1.Run();
	J1.Stop();
	cout << endl;
	J2.Run();
	J2.Stop();
	cout << endl;
}