本关任务:声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。
为了完成本关任务,你需要掌握
访问控制符:在 C++ 中,类的成员(包括数据成员和成员函数)可以有三种访问控制符:public
(公共的)、private
(私有的)和protected
(受保护的)。
1.public
成员:可以在类的外部直接访问。例如:
class MyClass {
public:
int publicVariable;
void publicFunction() {
// 函数体
}
};
int main() {
MyClass obj;
obj.publicVariable = 10; // 直接访问public数据成员
obj.publicFunction(); // 直接调用public成员函数
return 0;
}
2.private
成员:只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。例如:
class MyClass {
private:
int privateVariable;
public:
void setPrivateVariable(int value) {
privateVariable = value; // 在类内部访问private数据成员
}
int getPrivateVariable() {
return privateVariable; // 在类内部访问private数据成员
}
};
int main() {
MyClass obj;
// obj.privateVariable = 20; // 错误,不能在类外部直接访问private成员
obj.setPrivateVariable(20); // 通过public成员函数来间接访问和修改private成员
int value = obj.getPrivateVariable();
return 0;
}
3.protected
成员:它类似于private
成员,在类的外部不能直接访问。但是,protected
成员可以在派生类(继承该类的子类)中访问。例如:
class BaseClass {
protected:
int protectedVariable;
public:
void setProtectedVariable(int value) {
protectedVariable = value;
}
};
class DerivedClass : public BaseClass {
public:
void modifyProtectedVariable() {
protectedVariable += 10; // 在派生类中访问基类的protected成员
}
};
int main() {
DerivedClass obj;
// obj.protectedVariable = 30; // 错误,不能在类外部直接访问protected成员
obj.setProtectedVariable(30);
obj.modifyProtectedVariable();
return 0;
}
定义和作用:构造函数是一种特殊的成员函数,它的名字与类名相同,没有返回值类型(包括void
)。它主要用于初始化类的对象。例如:
class MyClass {
public:
int value;
MyClass() {
value = 0; // 初始化数据成员
}
};
执行时机:当创建一个对象时,构造函数会自动被调用。例如:
int main() {
MyClass obj; // 调用MyClass的默认构造函数
return 0;
}
重载构造函数:可以有多个构造函数,它们的参数列表不同,这称为构造函数的重载。例如:
class MyClass {
public:
int value;
MyClass() {
value = 0;
}
MyClass(int initValue) {
value = initValue;
}
};
int main() {
MyClass obj1; // 调用默认构造函数
MyClass obj2(10); // 调用带参数的构造函数
return 0;
}
定义和作用:析构函数也是一种特殊的成员函数,它的名字是在类名前面加上~
符号,没有参数和返回值类型。它主要用于在对象销毁时释放资源,如动态分配的内存、打开的文件等。例如:
class MyClass {
public:
int* dynamicArray;
MyClass() {
dynamicArray = new int[10];
}
~MyClass() {
delete[] dynamicArray; // 释放动态分配的内存
}
};
执行时机:析构函数在对象的生命周期结束时自动被调用。如果对象是在栈上创建的,那么当对象所在的作用域结束时,析构函数就会被调用;如果对象是在堆上创建的(使用new
创建),那么当使用delete
删除对象时,析构函数会被调用。例如:
int main() {
MyClass obj1; // 在栈上创建对象,作用域结束时析构函数被调用
MyClass* obj2 = new MyClass;
// 使用obj2
delete obj2; // 使用delete时析构函数被调用
return 0;
}
Engine
类表示汽车发动机,和一个Car
类,Car
类中包含一个Engine
对象作为其数据成员来表示汽车有一个发动机。首先定义Engine
类:
class Engine {
public:
void start() {
// 启动发动机的代码
std::cout << "Engine started." << std::endl;
}
void stop() {
// 停止发动机的代码
std::cout << "Engine stopped." << std::endl;
}
};
然后定义Car
类,其中包含Engine
对象:
class Car {
private:
Engine engine;
public:
void drive() {
engine.start();
// 汽车行驶的代码
std::cout << "Car is driving." << std::endl;
}
void park() {
// 汽车停车的代码
engine.stop();
}
};
在main
函数中使用:
int main() {
Car myCar;
myCar.drive();
myCar.park();
return 0;
}
在这个例子中,Car
类组合了Engine
类,Car
类的对象myCar
可以通过其内部的Engine
对象engine
来调用Engine
类的成员函数start
和stop
,从而实现汽车的行驶和停车功能。
参考实验指导书第四章的实验步骤 4:
根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。
预期输出:
构造了一个Computer!
Computer开始运行!
CPU开始运行!
RAM开始运行!
CDROM开始运行!
Computer停止运行!
CPU停止运行!
RAM停止运行!
CDROM停止运行!
析构了一个Computer!
#include <iostream>
using namespace std;
class CPU
{
public:
CPU (){}
~CPU () {}
void Run() {cout << "CPU开始运行!" << endl; }
void Stop() {cout << "CPU停止运行!" << endl; }
};
class RAM
{
public:
RAM () {}
~RAM () {}
void Run() {cout << "RAM开始运行!" << endl; }
void Stop() {cout << "RAM停止运行!" << endl; }
};
class CDROM
{
public:
CDROM () {}
~CDROM () {}
void Run() {cout << "CDROM开始运行!" << endl; }
void Stop() {cout << "CDROM停止运行!" << endl; }
};
class Computer
{
private:
CPU cpu;
RAM ram;
CDROM cdrom;
public:
Computer (CPU c, RAM r, CDROM cd)
{
cpu = c;
ram = r;
cdrom = cd;
cout << "构造了一个Computer!" << endl;
}
~Computer () {cout << "析构了一个Computer!"; }
CPU GetCPU() const { return cpu; }
RAM GetRAM() const { return ram; }
CDROM GetCDROM() const {return cdrom; }
void setCPU(CPU c) { cpu = c; }
void setRAM(RAM r) { ram = r; }
void setCDROM(CDROM cd) { cdrom = cd; }
void Run() {
cout << "Computer开始运行!" << endl;
/********** Begin **********/
cpu.Run();
ram.Run();
cdrom.Run();
/********** End **********/
}
void Stop () {
cout << "Computer停止运行!" << endl;
/********** Begin **********/
cpu.Stop();
ram.Stop();
cdrom.Stop();
/********** End **********/
}
};
int main() {
CPU c;
RAM r;
CDROM cd;
Computer computer(c, r, cd);
computer.Run();
computer.Stop();
}