C++-类与对象-Computer类(头歌)

任务描述

 声明一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,有两个公有成员函数run、stop。cpu 为CPU类的一个对象,ram为RAM 类的一个对象,cdrom为CDROM 类的一个对象,声明并实现这个类。

相关知识

为了你能够更好的完成本关任务,你需要掌握

类的组合。

类的组合

组合的概念

类中的成员是另一个类的对象;

可以在已有抽象的基础上实现更复杂的抽象。

类组合的构造函数设计

原则:不仅要负责对本类中的基本类型成员数据初始化,也要对对象成员初始化。

声明形式: 类名::类名(对象成员所需的形参,本类成员形参) :对象1(参数),对象2(参数),...... { //函数体其他语句 }

构造组合类对象时的初始化次序

首先对构造函数初始化列表中列出的成员(包括基本类型成员和对象成员)进行初始化,初始化次序是成员在类体中定义的次序; 成员对象构造函数调用顺序:按对象成员的声明顺序,先声明者先构造; 初始化列表中未出现的成员对象,调用用默认构造函数(即无形参的)初始化;

处理完初始化列表之后,再执行构造函数的函数体。

例:类的组合,线段(Line)类

#include <iostream>

#include <cmath>

using namespace std;

class Point {//Point类定义

public:

Point(int xx = 0, int yy = 0) {

x = xx;

y = yy;

}

Point(Point &p);

int getX() { return x; }

int getY() { return y; }

private:

int x, y;

}

Point::Point(Point &p) { //复制构造函数的实现

x = p.x;

y = p.y;

cout << "Calling the copy constructor of Point" << endl;

}

//类的组合

class Line { //Line类的定义

public: //外部接口

Line(Point xp1, Point xp2);

Line(Line &l);

double getLen() { return len; }

private: //私有数据成员

Point p1, p2;//Point类的对象p1,p2

double len;

}

//组合类的构造函数

Line::Line(Point xp1, Point xp2) : p1(xp1), p2(xp2) {

cout << "Calling constructor of Line" << endl;

double x = static_cast<double>(p1.getX() - p2.getX());

double y = static_cast<double>(p1.getY() - p2.getY());

len = sqrt(x * x + y * y);

}

Line::Line (Line &l): p1(l.p1), p2(l.p2) {//组合类的复制构造函数

cout << "Calling the copy constructor of Line" << endl;

len = l.len;

}

//主函数

int main() {

Point myp1(1, 1), myp2(4, 5); //建立Point类的对象

Line line(myp1, myp2); //建立Line类的对象

Line line2(line); //利用复制构造函数建立一个新对象

cout << "The length of the line is: ";

cout << line.getLen() << endl;

cout << "The length of the line2 is: ";

cout << line2.getLen() << endl;

return 0;

}

运行结果如下:

Calling the copy constructor of Point

Calling the copy constructor of Point

Calling the copy constructor of Point

Calling the copy constructor of Point

Calling constructor of Line

Calling the copy constructor of Point

Calling the copy constructor of Point

Calling the copy constructor of Line

The length of the line is: 5

The length of the line2 is: 5

前向引用声明

类应该先声明,后使用;

如果需要在某个类的声明之前,引用该类,则应进行前向引用声明;

前向引用声明只为程序引入一个标识符,但具体声明在其他地方;

注意

使用前向引用声明虽然可以解决一些问题,但它并不是万能的。

在提供一个完整的类声明之前,不能声明该类的对象,也不能在内联成员函数中使用该类的对象。

当使用前向引用声明时,只能使用被声明的符号,而不能涉及类的任何细节。

 例:

class B; //前向引用声明

class A {

public:

void f(B b);

};

class B {

public:

void g(A a);

};

 例:

class Fred; //前向引用声明

class Barney {

Fred x; //错误:类Fred的声明尚不完善

};

class Fred {

Barney y;

};

任务要求

编写一个Computer类,并将代码补充在右侧的任务挑战区 Begin-End 之间。

测试说明

根据提示,在右侧编辑器补充代码,保持类的结构。

平台会对你编写的代码进行测试,程序输出应为:

构造了一个 Computer!

Compute r开始运行!

CPU 开始运行!

RAM 开始运行!

CDROM 开始运行!

Computer 停止运行!

CPU 停止运行!

RAM 停止运行!

CDROM 停止运行!

析构了一个 Computer!

450b31836f814768b6bdd44a61992512.jpg

f6b549a5cbf345a59eb6924fc892bc03.jpg 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值