今天做了三道C++的练习题,前两道比较简单,松松AC。关于最后一道,由于有一些C++的基础知识还没有掌握的太清楚,修改的比较多。于是就想写一下关于这道题的知识总结及其拓展延伸。
题目
定义一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,有两个公有成员函数run、stop。Cpu为CPU类的对象,ram为RAM类的一个对象,cdrom为CDROM类的对象,定义并实现这个类。
分析
其实是一道比较基础的组合类的问题,但是组合类的知识没有掌握的很周全,还有就是关于枚举类型的定义和调用的问题,
首先附上我写的代码(弱弱的我,如果有问题轻大佬多多指教^_^)
#include<iostream>
using namespace std;
enum CPU_Ranl {
P1 = 1, P2, P3, P4, P5, P6, P7
};
class CPU
{
public:
CPU() {
cout << "CPU构造函数被调用" << endl;
frequency = 0;
voltage = 0;
}
void run() { cout << "CPU开始运行" << endl; }
void stop() { cout << "CPU停止运行" << endl; }
~CPU() { cout << "CPU析构函数被调用" << endl; }
private:
enum CPU_Ranl rank;
int frequency;
float voltage;
};
class RAM
{
public:
RAM() { cout << "RAM构造函数被调用" << endl; }
~RAM(){ cout << "RAM析构函数被调用" << endl; }
void run() { cout << "RAM开始运行" << endl; }
void stop() { cout << "RAM停止运行" << endl; }
};
class CDROM
{
public:
CDROM() { cout << "CDROM构造函数被调用" << endl; }
~CDROM() { cout << "CDROM析构函数被调用" << endl; }
void run() { cout << "CDROM开始运行" << endl; }
void stop() { cout << "CDROM停止运行" << endl; }
};
class Computer
{
public:
Computer() {
cout << "Computer构造函数被调用" << endl;
}
~Computer() {
cout << "Computer析构函数被调用" << endl;
}
void run() {
cout << "Computer开始运行" << endl;
cpu.run();
ram.run();
cdrom.run();
}
void stop() {
cpu.stop();
ram.stop();
cdrom.stop();
cout << "Computer停止运行" << endl;
}
private:
CPU cpu;
RAM ram;
CDROM cdrom;
};
int main()
{
Computer t;
t.run();
t.stop();
return 0;
}
输出结果
CPU构造函数被调用
RAM构造函数被调用
CDROM构造函数被调用
Computer构造函数被调用
Computer开始运行
CPU开始运行
RAM开始运行
CDROM开始运行
CPU停止运行
RAM停止运行
CDROM停止运行
Computer停止运行
Computer析构函数被调用
CDROM析构函数被调用
RAM析构函数被调用
CPU析构函数被调用
解释
1.首先关于输出的结果解释,
当我们创建Computer类的时候,如果这个类具有内嵌对象的成员(比如CPU,RAM,CDROM,)的时候,那么各个内嵌对象将首先被自动的进行创建,而在创建各个内前对象的时候需要分别对他们进行初始化。而根据我的理解,初始化的方式有两种,一种是通过组合类的构造函数进行初始化(这种是基于一些内前对象属于基本数据类型的时候来进行的)。还有一些是通过调用内嵌类对象构造函数来完成的初始化。而我们这个题目显然是第二种初始化的方式。
那么这里就会出现一种问题就是内嵌类对象的构造函数及其析构函数的调用顺序的问题。其实也很好理解,系统在调用内嵌对象的构造函数时候,调用的顺序是按照内嵌对象在组合类的顺序来调用的,而析构函数的调用执行顺序恰好与构造函数的调用顺序相反。
2.之后就是关于枚举类型(enum)知识的简要补充
个人认为枚举类型常用的就是她的定义和对象的调用
(1)枚举类型的定义
为了简单明了还是 直接上代码:
enum Day
{
Sun = 0, Mon, Tues, Wed, Thur, Fri, Sat
};
也可以这样写:
enum Day
{
Mon = 1, Tues = 2, Wed, Thur, Fri, Sat, Sun
};
也就是说初始化定义了第一个元素之后,后面的值即可依次顺延加一,
(2)枚举类对象的调用和赋值
调用
int main()
{
Day yesterday, today, tomorrow;
yesterday = Tues;
today = Wed;
tomorrow = Thur;
cout << yesterday << endl;
cout << today << endl;
cout << tomorrow << endl;
return 0;
}
赋值
这里赋值不能直接将整数直接赋值给枚举类对象,而是要先强制转换之后才能赋值给它
int main()
{
Day yesterday, today, tomorrow;
yesterday = (Day)4; //需要强制转换再赋值
today = (Day)5;
tomorrow = (Day)6;
cout << yesterday << endl;
cout << today << endl;
cout << tomorrow << endl;
return 0;
}