// 构造函数与析构函数及类的组合

#include "stdafx.h"
#include <iostream>
using namespace std;

//枚举
enum CPU_Rank {P1=1,P2,P3,P4,P5,P6,P7};

class CPU
{
private:
    CPU_Rank rank;
    int frequency;
    float voltage;
public:
    CPU(CPU_Rank r, int f, float v)
    {
        rank = r;
        frequency = f;
        voltage = v;

cout << "构造了一个CPU!" << endl;
    }
    
    //CPU拷贝构造函数
    CPU(const CPU &c){
        rank = c.rank;
        frequency = c.frequency;
        voltage = c.voltage;

cout << "拷贝构造了一个CPU!" << endl;
    }

//CPU析构函数
    ~CPU(){
        cout << "析构了一个CPU!" << endl;
    }

//函数API接口
    CPU_Rank GetRank() const {return rank;}
    int GetFrequency() const {return frequency;}
    float GetVoltage() const {return voltage;}

void SetRank(CPU_Rank r) {rank = r;}
    void SetFrequnecy(int f) {frequency = f;}
    void SetVoltage(float v) {voltage = v;}

void Run() {cout << "CPU开始运行!" << endl;}
    void Stop() {cout << "CPU停止运行!" << endl;}
};

//枚举
enum RAM_Type{DDR2 = 2, DDR3, DDR4};

class RAM{
private:
    enum RAM_Type type;
    unsigned int frequency;
    unsigned int size;
public:
    RAM(RAM_Type t, unsigned int f, unsigned int s){
        type = t;
        frequency = f;
        size = s;
        cout << "构造一个RAM!" << endl;
    }

//RAM拷贝构造函数
    RAM(const RAM &c){
        type = c.type;
        frequency = c.frequency;
        size = c.size;

cout << "拷贝构造了一个RAM!" << endl;
    }

//RAM析构函数
    ~RAM(){cout << "析构一个RAM!" << endl;}

//函数API接口
    RAM_Type GetType() const {return type;}
    unsigned int GetFrequency() const {return frequency;}
    unsigned int GetSize() const {return size;}

void SetRank(RAM_Type t) {type = t;}
    void SetFrequnecy(unsigned int f) {frequency = f;}
    void SetSize(unsigned int s) {size = s;}

void Run() {cout << "RAM开始运行!" << endl;}
    void Stop() {cout << "RAM停止运行!" << endl;}

};

//枚举
enum CDROM_Interface{SATA, USB};
enum CDROM_Install_type{exteral, built_in};

class CD_ROM
{
private:
    enum CDROM_Interface interface_type;
    unsigned int cache_size;
    CDROM_Install_type install_type;

public:
    CD_ROM(CDROM_Interface i, unsigned int s, CDROM_Install_type it){
        interface_type = i;
        cache_size = s;
        install_type = it;
        cout << "构造了一个CD_ROM!" << endl;
    }

//CD_ROM拷贝构造函数
    CD_ROM(const CD_ROM &c){
        interface_type = c.interface_type;
        cache_size = c.cache_size;
        install_type = c.install_type;

cout << "拷贝构造了一个CD_ROM!" << endl;
    }

//CD_ROM析构函数
    ~CD_ROM(){
        cout << "析构了一个CD_ROM!" << endl;
    }

//函数API接口
    CDROM_Interface GetInterfaceType() const {return interface_type;}
    unsigned int GetSize() const {return cache_size;}
    CDROM_Install_type GetInstallType() const {return install_type;}

void SetInterfaceType(CDROM_Interface i) {interface_type = i;}
    void SetSize(unsigned int s) {cache_size = s;}
    void SetInstallType(CDROM_Install_type it) {install_type = it;}

void Run() {cout << "CD_ROM开始运行!" << endl;}
    void Stop() {cout << "CD_ROM停止运行!" << endl;}
};

class COMPUTER
{
private:
    CPU my_cpu;
    RAM my_ram;
    CD_ROM my_cdrom;
    unsigned int storage_size;
    unsigned int bandwidth;
public:
    COMPUTER(CPU c, RAM r, CD_ROM cd, unsigned int s, unsigned int b);
    
    //COMPUTER析构函数
    ~COMPUTER(){cout << "析构一个COMPUTER!" << endl;}

void Run(){
        my_cpu.Run();
        my_ram.Run();
        my_cdrom.Run();
        cout << "COMPUTER开始运行!" << endl;
    }

void Stop(){
        my_cpu.Stop();
        my_ram.Stop();
        my_cdrom.Stop();
        cout << "COMPUTER停止运行!" << endl;
    }
};

//COMPUTER构造函数的函数体   {类名::函数名:初始化列表}  此处需要调用两次拷贝构造函数分别是:CPU c, RAM r, CD_ROM cd
COMPUTER::COMPUTER(CPU c, RAM r, CD_ROM cd, unsigned int s, unsigned int b):my_cpu(c),my_ram(r),my_cdrom(cd),storage_size(s),bandwidth(b){
    //storage_size = s;
    //bandwidth = b;

cout << "构造了一个COMPUTER!" <<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    CPU a(P6,300,2.8);
    a.Run();
    a.Stop();
    cout << "*********************************************" << endl;

RAM b(DDR3, 1600, 8);
    b.Run();
    b.Stop();
    cout << "*********************************************" << endl;

CD_ROM c(SATA, 2, built_in);
    c.Run();
    c.Stop();
    cout << "*********************************************" << endl;
    
    COMPUTER my_computer(a, b, c, 128, 10);
    cout << "*********************************************" << endl;
    my_computer.Run();
    my_computer.Stop();
    cout << "*********************************************" << endl;

//system("pause");  //此语句会提前中止程序,会导致程序不能顺利的调用析构函数
    return 0;
    //在执行完return 0; 语句后调用析构函数
}

C++中的构造函数与析构函数及组合类的调用的更多相关文章

  1. python中的构造函数和析构函数

    python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...

  2. (转载)C++中, 构造函数和析构函数能不能被显示调用?

    (转载)http://blog.csdn.net/zhangxinrun/article/details/6056321 代码: view plaincopy to clipboardprint?#i ...

  3. C++中的构造函数和析构函数

    构造函数: 在类实例化对象时自动执行,对类中的数据进行初始化.构造函数可以从载,可以有多个,但是只能有一个缺省构造函数. 析构函数: 在撤销对象占用的内存之前,进行一些操作的函数.析构函数不能被重载, ...

  4. 菜鸟谈谈C#中的构造函数和析构函数

    本节说明对象的创建.初始化和销毁过程.本节介绍下列主题: l         类构造函数 l         结构构造函数 l         析构函数 类构造函数 本节将讨论三种类构造函数: 类构造 ...

  5. 005_python中的构造函数和析构函数

    python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...

  6. C# 中的构造函数与析构函数

    C# 中的构造函数 类的 构造函数 是类的一个特殊的成员函数,当创建类的新对象时执行. 构造函数的名称与类的名称完全相同,它没有任何返回类型. 下面的实例说明了构造函数的概念: using Syste ...

  7. php中的构造函数与析构函数

    PHP面向对象——构造函数.析构函数 __construct.__destruct__construct 构造方法,当一个对象创建时调用此方法,使用此方法的好处是:可以使构造方法有一个独一无二的名称, ...

  8. C++类继承中的构造函数和析构函数 调用顺序

    思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...

  9. (C++)C++类继承中的构造函数和析构函数

    思想: 在C++的类继承中, 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时,其顺序正好与构造相反: 例子: #include <iostream& ...

随机推荐

  1. centos6安装vim插件youcompleteme问题及解决

    首先clone vim8代码库 git clone https://github.com/vim/vim.git 然后编译 注意下自己的python2.7config在哪儿 ./configure - ...

  2. GROUP_CONCAT 将mysql多条数据合并为一条

    实现将多条数据合并为一条数据,在mysql中可以通过 GROUP_CONCAT 函数实现 上面是潇leader发我的和工作不相关的小小小需求描述,很明显是要把id和name相同的数据合并为一条,下面按 ...

  3. 拒绝让Eclipse帮倒忙,解决其复制粘贴时把反斜杠变成双反斜杠的问题

    比如,你粘贴到字符串的文本是“C:\Users\horn1\Desktop”,结果变成了“C:\\Users\\horn1\\Desktop\\”,这还好,不会带来麻烦. 但是,比如你输入的是正则表达 ...

  4. 我大概知道他在说什么了,是对内存单元的竞争访问吧。Python有GIL,在执行伪码时是原子的。但是伪码之间不保证原子性。 UDP丢包,你是不是做了盲发?没有拥塞控制的情况下,确实会出现丢包严重的情况。你先看看发送速率,还有是否带有拥塞控制。

    我大概知道他在说什么了,是对内存单元的竞争访问吧.Python有GIL,在执行伪码时是原子的.但是伪码之间不保证原子性.   UDP丢包,你是不是做了盲发?没有拥塞控制的情况下,确实会出现丢包严重的情 ...

  5. Flutter 中的路由

    Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航. 并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.po ...

  6. Sword zlog日志库使用

    配置文件*.conf 配置文件具体内容如下: [global] #改变量可以不写,默认是true,如果使用设置为true时,Zlog就会严格检查所用格式和规则,否则,忽略所用格式和规则. strict ...

  7. python 判断文件是否存在和删除文件的api (其中判断文件在不在让想起这个可以强兼容jenkins工作目录那个问题)

    判断文件在不在的api: os即operating system(操作系统),Python 的 os 模块封装了常见的文件和目录操作. os.path模块主要用于文件的属性获取,exists是“存在” ...

  8. layui select渲染获取选中的option

    关键代码如下: form.on('select(groupCode)', function(data){ console.log($(data.elem).find("option:sele ...

  9. DevExpress v18.1 下载和教程文档

    http://www.zdfans.com/html/18682.html 教程文档 https://blog.csdn.net/AABBbaby/article/details/81094482 下 ...

  10. MySQL中事务的隔离级别

    MySQl InnoDB存储引擎实现SQL标准的4种隔离级别(RU,RC,RR,serializable),用来限定事务内外的哪些改变时可见的,哪些时不可见的.低级别的隔离级一般支持更高的并发处理,并 ...