首页 > 其他分享 >初始化列表和函数体内赋值的一个区别:

初始化列表和函数体内赋值的一个区别:

时间:2024-12-21 14:02:10浏览次数:6  
标签:初始化 调用 列表 复制 赋值 CPU 构造函数

先提出问题:

看着乌漆嘛黑的代码,我的脑子在想运行结果为什么不是两“大”次复制构造函数,因为我认为传入参数这是第一步会调用复制构造函数,但是把参数赋值给类的实例对象的数据成员这也应该是复制构造函数啊。(这可是我花了几个小时才验证到的结果啊)

这是两种不同的写法的不同输出:

如果是初始化列表,我们就会调用三次复制构造函数

如果是简单的赋值,我们就会调用三次构造函数。

#include <iostream>
using namespace std;

class CPU
{
public:
    CPU (){cout<<"创建了CPU"<<endl;}
    CPU(const CPU&other){
    	cout<<"复制一份CPU"<<endl;
	}
    ~CPU () {cout<<"析构了CPU"<<endl;}
    void Run() {cout << "CPU开始运行!" << endl; }
    void Stop() {cout << "CPU停止运行!" << endl; }
};

class RAM
{
public:
    RAM () {cout<<"创建了RAM"<<endl;}
    RAM(const RAM&other){
    	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(const CDROM&other){
    	cout<<"复制一份CDROM"<<endl;
	}
    ~CDROM () {cout<<"析构了CDROM"<<endl;}
    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!"<<endl; }

    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 c1;
    RAM r1;
    CDROM cd1;
    Computer computer(c1, r1, cd1);
    computer.Run();
    computer.Stop();
}

标签:初始化,调用,列表,复制,赋值,CPU,构造函数
From: https://blog.csdn.net/2301_79982845/article/details/144630307

相关文章

  • 数组[1,2,3,4,5]有5个元素,直接给它的length属性赋值结果会怎么样?
    在JavaScript中,如果你尝试改变一个数组的length属性,这将会影响数组的大小和内容。具体来说,如果你减小数组的length,那么数组将被截断,超出新长度的元素将被删除。相反,如果你增加数组的length,那么新的元素位置将被创建,但这些新位置的值将是undefined。例如,对于数组[1,2,3,4,5],如果我......
  • 关于stm32f407 cherryusb初始化失败“This dwc2 version does not support dma mode,
    初学cherryusb,照着论坛帖子操作,将cherryusb软件包加入到407工程,编译完成后,下载,出现如下问题:[I/USB]dwc2has1channelsanddfifodepth(32-bitwords)is0[E/USB]Thisdwc2versiondoesnotsupportdmamode,sostopworking通过反复确认,各种定位尝试,最终发现是usb模......
  • Python中的数据序列(列表,元组,字典,集合)
    目录列表 语法特点 列表的操作方式查操作增操作改操作删操作元组语法运用场景元组的操作字典语法 字典的操作方式增操作删操作 改操作查操作字典的遍历操作集合语法集合的操作方式增操作删操作 查操作 数据序列之间的转换 列表 语法......
  • 集合间的赋值被同时清空的问题
    问题创建一个集合例如:Listlist1为其填充内容后,在将其赋值到一个新集合例如Listlist2。当对list1进行清空时list2的值也会随之清空。List<int>list1=newList<int>{1,2,3,4};//创建并填充集合List<int>list2;//定义list2list2=list1;//将l......
  • 关于vue3中 再进入模块前的一些请求初始化数据的方法
    在进页面前可能需要初始化一些请求数据,用于后续的数据请求传统的做法是在mounted中嵌套请求方法来请求数据在vue3中我们可以使用 beforeRouteEnter<scriptlang="ts">exportdefault{ asyncbeforeRouteEnter(to:any,from:any,next){  console.log(111); ......
  • vector容器/构造函数/赋值操作/容量和大小/插入和删除/数据存储/互换容器/预留空间
    vector基本概念功能:vector数据结构和数组非常相似,也称为单端数组vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,然后将元数据拷贝新空间,释放原空间vector容器的迭代器是支持随机访问的......
  • [oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words
    python有哪些关键字_keyword_list_列表_reserved_words回忆上次内容helloworld不是从来就有的来自于c语言 print、小括号和双引号也来自于c语言   添加图片注释,不超过140字(可选) python标识符的命名规则......
  • 前端必知必会-JavaScript HTML DOM 节点列表
    文章目录JavaScriptHTMLDOM节点列表HTMLDOMNodeList对象HTMLDOM节点列表长度HTMLCollection和NodeList之间的区别总结JavaScriptHTMLDOM节点列表HTMLDOMNodeList对象NodeList对象是从文档中提取的节点列表(集合)。NodeList对象与HTMLCollectio......
  • PbootCMS中如何使用列表标签来显示文章标签?
    在PbootCMS中,使用列表标签来显示文章标签是一种常见的需求,可以通过特定的标签语法来实现。以下是详细的说明和示例:可用的列表标签:[tags:n]:序号从0开始。[tags:i]:序号从1开始。[tags:link]:链接地址。[tags:text]:标签名称。基本用法:这些标签通常用于循环输出文章的标......
  • 给我2分钟,保证教会你在Vue3中实现一个定高的虚拟列表
    前言虚拟列表对于大部分一线开发同学来说是一点都不陌生的东西了,有的同学是直接使用第三方组件。但是面试时如果你简历上面写了虚拟列表,却给面试官说是通过三方组件实现的,此时空气可能都凝固了。所以这篇文章欧阳将会教你2分钟内实现一个定高的虚拟列表,至于不定高的虚拟列表下一......