HJ C++11 Day2

Initializer Lists

对于一个类P

class P{P(int a, int b){cout << "P(int, int), a=" << a << ", b = " << b << endl;}P(initializer_list<int> initlist){cout << "P(initializer_list<int>), values= ";for(auto i : initlist)cout << i << ' ';cout << endl;}
}

当运行

//和第一种构造函数完全吻合
P p(77, 5);    //P(int a, int b), a = 77, b = 5
//输入参数为一包,和第二种构造函数更加符合
P q{77, 5};    //P(initializer_list<int> initlist), values = 77 5
//输入参数为一包,只能与第二种构造函数吻合
P r{77, 5, 42};//P(initializer_list<int> initlist), values = 77 5 42
//一包参数,和第二种构造函数更加符合
P s = {77, 5};    //P(initializer_list<int> initlist), values = 77 5 42

讨论:如果只有第一种构造函数时,p不受影响,q也不受影响,因为这一包数据会被拆解为2个数据,恰好符合构造函数的参数要求,但是r会被拆解为3个参数,不符合构造函数的要求,s也不影响。

initializer_list的背后是一个array,但是实际上array是一个迭代器。
编译器在看到大括号{}时就会自动调用initializer_list的私有构造函数,按理说应该没有人能够调用它的私有构造函数,但是编译器具有最高权限,编译器可以调用。实际过程是:编译器在看到大括号{}后,在调用私有构造函数之前,就已经准备好了一个array,然后把这个array的头部传进来,长度也传进来,将其登记起来。

explicit(用于输入参数多于1个实参(多个参数没有默认值)的构造函数)

拒绝隐式的类型转换,让编译器不要自作聪明,在构造函数前声明,则只有被人为明确调用时才会调用,不允许编译器自己偷偷调用。
对于一个类P

class P{
public:P(int a, int b){cout << "P(int a, int b) \n";}P(initializer_list<int>){cout << "initializer_list<int> \n";}explicit P(int a, int b, int c){cout << "explicit P(int a, int b, int c) \n";}
}
void fp(const P&){};

运行下面的代码

P p1(77, 5);   //P(int a, int b)
P p2{77, 5};   //P(initializer_list<int>)
P p3{77, 5, 42};   //P(initializer_list<int>)
P p4 = {77, 5};   //P(initializer_list<int>)
P p5 = (77, 5, 42);  //error
p P6(77, 5, 42);    //explicit P(int a, int b, int c)
P p7 = {77, 5, 42};   //P(initializer_list<int>)fp({47, 11});       //P(initializer_list<int>)
fp({47, 11, 3});    //error
fp(P{47, 11});       //P(initializer_list<int>)
fp(P{47, 11, 3});    //P(initializer_list<int>)p P11{77, 5, 42, 500};  //P(initializer_list<int>)
p P12 = {77, 5, 42, 500};  //P(initializer_list<int>)
p P13{10};  //P(initializer_list<int>)

下面重点解释下为什么P p3{77, 5, 42}; 不会报错,但是P p5 = (77, 5, 42); 会报错:
P p3{77, 5, 42}; 属于列表构造,你使用花括号{}初始化时,initializer_list<int> 构造函数会优先被调用,不会再管explicit P(int a, int b, int c)构造函数,所以不会报错。
但是P p5 = {77, 5, 42};属于拷贝构造,拷贝构造会隐式调用P(int a, int b, int c)但是该构造函数前面加了个explicit,导致没有合适的构造函数可以调用,最终导致报错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派5首次开机保姆级教程(无显示器通过VNC连接树莓派桌面)

第一次开机详细步骤 步骤一&#xff1a;树莓派系统烧录1 搜索打开烧录软件“Raspberry Pi Imager”2 选择合适的设备、系统、SD卡3 烧录配置选项 步骤二&#xff1a;SSH远程树莓派1 树莓派插电2 网络连接&#xff08;有线或无线&#xff09;3 确定树莓派IP地址 步骤三&#xff…

装饰器模式--RequestWrapper、请求流request无法被重复读取

目录 前言一、场景二、原因分析三、解决四、更多 前言 曾经遇见这么一段代码&#xff0c;能看出来是把request又重新包装了一下&#xff0c;核心信息都不会改变 后面了解到这叫 装饰器模式&#xff08;Decorator Pattern&#xff09; &#xff1a;也称为包装模式(Wrapper Pat…

大语言模型进化论:从达尔文到AI的启示与展望

文章大纲 引言大语言模型中的“进化论”思想体现遗传变异过度繁殖和生存斗争大模型“过度繁殖”与“生存竞争”机制解析**一、过度繁殖:技术迭代的指数级爆发****二、生存竞争:计算资源的达尔文战场****三、生存竞争胜出关键要素****四、行业竞争格局演化趋势**核心结论自然选…

监听 RabbitMQ 延时交换机的消息数、OpenFeign 路径参数传入斜杠无法正确转义

背景 【MQ】一套为海量消息和高并发热点消息&#xff0c;提供高可用精准延时服务的解决方案 我现在有一个需求&#xff0c;就是监听 RabbitMQ 一个延时交换机的消息数&#xff0c;而 RabbitTemplate 是不存在对应的方法来获取的。 而我们在 RabbitMQ 的控制台却可以发现延时交…

分布式网络

分布式网络&#xff08;Distributed Network&#xff09;指的是一种计算机网络架构&#xff0c;其中计算资源&#xff08;计算、存储、数据处理等&#xff09;分布在多个物理或逻辑上的节点上&#xff0c;而不是集中在单一的服务器或数据中心中。这种架构的主要目标是提高系统的…

【Elasticsearch】Elasticsearch 中使用 HDFS 存储快照

在 Elasticsearch 中使用 HDFS 存储快照的步骤如下&#xff1a; 1.安装 HDFS 插件 要使用 HDFS 存储 Elasticsearch 的索引快照&#xff0c;需要在 Elasticsearch 集群的所有节点上安装 HDFS 插件。 • 在线安装&#xff1a;适用于网络环境良好的场景&#xff0c;执行以下命…

浅谈 DeepSeek 对 DBA 的影响

引言&#xff1a; 在人工智能技术飞速发展的背景下&#xff0c;DeepSeek 作为一款基于混合专家模型&#xff08;MoE&#xff09;和强化学习技术的大语言模型&#xff0c;正在重塑传统数据库管理&#xff08;DBA&#xff09;的工作模式。通过结合其强大的自然语言处理能力、推理…

STM32F4 UDP组播通信:填一填ST官方HAL库的坑

先说写作本文的原因&#xff0c;由于开项目开发中需要用到UDP组播接收的功能&#xff0c;但是ST官方没有提供合适的参考&#xff0c;使用STM32CubeMX生成的代码也是不能直接使用的&#xff0c;而我在网上找了一大圈&#xff0c;也没有一个能够直接解决的方案&#xff0c;deepse…

leetcode日记(85)验证二叉搜索树

不难&#xff0c;有两种解法&#xff08;看答案才想到中序遍历&#xff09;。 我用的是普通递归&#xff0c;和上一题差不多&#xff0c;规定min和max&#xff0c;每次遍历缩小范围: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNod…

如何在rust中解析 windows 的 lnk文件(快捷方式)

一、从标题二开始看&#x1f601; 这些天在使用rust写一个pc端应用程序&#xff0c;需要解析lnk文件获取lnk的图标以及原程序地址&#xff0c;之前并没有过pc端应用程序开发的经验&#xff0c; 所以在广大的互联网上游荡了两天。额&#x1f97a; 今天找到了这个库 lnk_parse很…

启动wsl里的Ubuntu24报错:当前计算机配置不支持 WSL2,HCS_E_HYPERV_NOT_INSTALLED

问题&#xff1a;启动wsl里的Ubuntu24报错 报错信息&#xff1a; 当前计算机配置不支持 WSL2。 请启用“虚拟机平台”可选组件&#xff0c;并确保在 BIOS 中启用虚拟化。 通过运行以下命令启用“虚拟机平台”: wsl.exe --install --no-distribution 有关信息&#xff0c;请访…

Python使用FastAPI结合Word2vec来向量化200维的语言向量数值

准备 pip install fastapi>0.68.0 pip install uvicorn[standard]>0.15.0 pip install gensim>4.0.0 pip install jieba>0.42.1 pip install numpy>1.21.0 pip install scikit-learn>1.0.0少了的就直接补充就好 代码 from fastapi import FastAPI, HTTPExc…

ControlNet

文章目录 摘要abstract1.ControlNet1.1 原文摘要1.2 模型架构1.3 架构细节1.4 训练损失函数1.5 实验1.6 结论 2.总结参考文献 摘要 本周学习的ControlNet 是一种用于文本到图像扩散模型&#xff08;如 Stable Diffusion&#xff09;的条件控制方法。它通过冻结预训练的扩散模型…

Visual-RFT视觉强化微调:用「试错学习」教会AI看图说话

&#x1f4dc; 文献卡 英文题目: Visual-RFT: Visual Reinforcement Fine-Tuning;作者: Ziyu Liu; Zeyi Sun; Yuhang Zang; Xiaoyi Dong; Yuhang Cao; Haodong Duan; Dahua Lin; Jiaqi WangDOI: 10.48550/arXiv.2503.01785摘要翻译: 像OpenAI o1这样的大型推理模型中的强化微调…

Hadoop管理页看不到任务的问题

这个yarn分配任务了但是为空 在$HADOOP_HOME/conf/mapred-site.xml 原来的配置文件基础之上添加&#xff1a; <property><name>mapreduce.framework.name</name><value>yarn</value></property> 重启之后就好了

傅里叶变换:跨越时空的数学魔法

引言&#xff1a;从振动到信息——傅里叶的智慧 傅里叶变换&#xff08;Fourier Transform&#xff09;是数学与工程领域最具影响力的工具之一。它的核心思想是将复杂的信号分解为简单的正弦波和余弦波的叠加&#xff0c;从而揭示隐藏在数据背后的频率信息。自19世纪法国数学家…

DR和BDR的选举规则

在 OSPF&#xff08;开放最短路径优先&#xff09;协议中&#xff0c;DR&#xff08;Designated Router&#xff0c;指定路由器&#xff09; 和 BDR&#xff08;Backup Designated Router&#xff0c;备份指定路由器&#xff09; 的选举是为了在广播型网络&#xff08;如以太网…

【linux网络编程】套接字编程API详细介绍

在C语言中&#xff0c;套接字&#xff08;Socket&#xff09;编程主要用于网络通信&#xff0c;尤其是在基于TCP/IP协议的应用程序开发中。常用的套接字编程API主要基于Berkeley Sockets&#xff08;伯克利套接字&#xff09;接口&#xff0c;这些函数通常在<sys/socket.h&g…

Linux和gcc/g++常用命令总结

目录 Linux命令总结 文件操作相关命令 ls cd pwd cp mv rm cat mkdir rmdir touch 文本处理操作命令 grep awk sed 进程管理操作相关命令 ps top htop kill pkill killall chmod chown 网络操作相关命令 ping ifconfig netstat ss lsof curl …

VUE的第二天

1. 指令修饰符 1.1什么是指令修饰符&#xff1f; ​ 所谓指令修饰符就是通过“.”指明一些指令后缀 不同的后缀封装了不同的处理操作 —> 简化代码 1.2按键修饰符 keyup.enter —>当点击enter键的时候才触发 代码演示&#xff1a; <div id"app"><…