zoukankan      html  css  js  c++  java
  • 关于嵌套类的小实验

    实验主要目的是明确在嵌套类中构造函数与析构函数的调用顺序与次数。

    下面是代码,注意本次代码并没有显式的复制构造函数,并且主进程中也没有调用默认复制构造函数的操作。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 /****************************************************/
     6 class CPU
     7 {
     8 private:
     9     bool isrun=false;
    10     int cpu_value;
    11     int max_cpu_value;
    12 public:
    13     CPU(){cout<<"set a CPU object!"<<endl;};
    14     ~CPU(){isrun=false;cout<<"delete a CPU object!"<<endl;};
    15     CPU(int CpuValue,int MaxCpuValue):cpu_value(CpuValue),max_cpu_value(MaxCpuValue){cout<<"set a CPU object!"<<endl;};
    16     void run(){isrun=true;};
    17     void stop(){isrun=false;};
    18     int get_cpu_value(){return cpu_value;};
    19     void set_max_cpu_value(int v){max_cpu_value=v;};
    20     int get_max_cpu_value(){return max_cpu_value;};
    21 };
    22 /****************************************************/
    23 class RAM
    24 {
    25 private:
    26     bool isLoaded=false;
    27     unsigned ram_size;
    28 public:
    29     RAM(){cout<<"set a RAM object!"<<endl;};
    30     ~RAM(){isLoaded=false;cout<<"delete a RAM object!"<<endl;};
    31     RAM(unsigned MaxSize):ram_size(MaxSize){cout<<"set a RAM object!"<<endl;};
    32     void RAM_load(){isLoaded=true;};
    33     void RAM_unload(){isLoaded=false;};
    34     unsigned get_ram_size(){return ram_size;};
    35 };
    36 /****************************************************/
    37 class COMPUTER
    38 {
    39 private:
    40     CPU main_cpu;
    41     CPU* virtual_cpu=nullptr;
    42     RAM main_ram;
    43     RAM* virtual_ram=nullptr;
    44     bool isrunning=false;
    45 public:
    46     COMPUTER(){cout<<"set a COMPUTER object!"<<endl;};
    47     ~COMPUTER();
    48     void RunComputer();
    49     void StopComputer();
    50     void set_virtual_cpu();
    51     void set_virtual_ram();
    52 };
    53 /*--------------------------------------------------*/
    54 
    55 COMPUTER::~COMPUTER()
    56 {
    57     cout<<"delete a COMPUTER object!"<<endl;
    58     if(virtual_cpu!=nullptr)delete virtual_cpu;
    59     if(virtual_ram!=nullptr)delete virtual_ram;
    60 }
    61 
    62 void COMPUTER::StopComputer()
    63 {
    64     main_cpu.stop();
    65     main_ram.RAM_unload();
    66     if(virtual_cpu!=nullptr)virtual_cpu->stop();
    67     if(virtual_ram!=nullptr)virtual_ram->RAM_unload();
    68 }
    69 
    70 void COMPUTER::set_virtual_ram()
    71 {
    72     virtual_ram=new RAM(main_ram.get_ram_size());
    73     virtual_ram->RAM_load();
    74 }
    75 
    76 void COMPUTER::set_virtual_cpu()
    77 {
    78     virtual_cpu=new CPU(0,(main_cpu.get_max_cpu_value())/2);
    79     virtual_cpu->run();
    80 }
    81 
    82 void COMPUTER::RunComputer()
    83 {
    84     main_cpu.run();
    85     main_ram.RAM_load();
    86     isrunning=true;
    87 }
    88 /*--------------------------------------------------*/
    89 /****************************************************/
    90 
    91 int main()
    92 {
    93     COMPUTER mycomputer;
    94     mycomputer.set_virtual_cpu();
    95     mycomputer.set_virtual_ram();
    96     mycomputer.RunComputer();
    97     mycomputer.StopComputer();
    98     return 0;
    99 }

    运行结果如下:

    set a CPU object!
    set a RAM object!
    set a COMPUTER object!
    set a CPU object!
    set a RAM object!
    delete a COMPUTER object!
    delete a CPU object!
    delete a RAM object!
    delete a RAM object!
    delete a CPU object!
    
    Process returned 0 (0x0)   execution time : 0.002 s
    Press ENTER to continue.

    各个类型的构造与析构次数相对应。

    如果有复制构造函数的使用,则在一下情形下会发生构造与析构,以下情形也正是复制构造函数的调用的三种情形:在一个对象以值传递的方式传入函数体时;一个对象以值传递的方式从函数返回时;一个对象用于给另外一个对象进行初始化(常称为赋值初始化)时被自动调用。

  • 相关阅读:
    通过AIR Native Extension在AIR应用中加入iAd广告(一) —— Flash Builder篇
    使用MonoTouch.SQLite简化用户界面开发
    常见的几种分支开发方式
    给对象增加一个简单的自定义事件机制
    WCF 4.5:配置文件更小,对ASP.NET的支持更好
    MongoDB中的Group By
    SQL Server 2012大幅增强了TSQL
    编程珠玑:对DAO层的一点修改
    《The Elements of User Experience》读书笔记
    ORM工具LLBLGen Pro 3.5发布
  • 原文地址:https://www.cnblogs.com/savennist/p/12375898.html
Copyright © 2011-2022 走看看