持续创作,加速成长!这是我参与「掘金日新计划 · 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、运行解释
可以观察到,一共有二十个构造函数,二十个析构函数。仔细观察,前六行和最后六行,可以发现他们系统所构造或析构的变量是上下对称的。原因是因为,我们在创建变量时,变量会被保存在栈区,而栈具有“先进后出,后进先出”的特点,所以先构造的变量会最后被析构,而后构造的变量靠近栈顶会先被析构(即内存被释放)。需要注意的是,有些变量(往往会是全局变量)会在整个程序结束之前被析构,而有的局部变量是在某个函数调用完之后,整个程序结束之前被析构。
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;
}