当前位置: 首页 > news >正文

116 C++ 可变参数函数,initializer_list (初始化列表), 省略号形参

一 可变参数函数

有时候我们传递的参数是不固定的。

这种能接受非固定个数参数的函数就是可变参数函数

怎么实现呢?就要用到 initializer_list 标准库类型

该类型能够使用的前提条件是:所有的实参类型相同。

二,initializer_list(初始化列表) C++11的类模版

如果一个函数,它的实参数量不可预知,但是所有参数的类型相同,我们就可以使用这个initializer_list 类型的形参来接收

我们把 initializer_list 理解成某种类型值的数组。

这个类模版里面指定的类型模版参数就是数组里保存的数据的类型

需要包含 #include <initializer_list> 头文件 或者 iostream

要注意的是 initializer_list<int >myarray 中的元素永远都是常量值。不能被改变。

1. 基本方法 :begin(), end()遍历,size()获取元素个数

void func150(initializer_list<int> myarray) {//遍历形参,类似于迭代器的遍历for (auto iter = myarray.begin(); iter != myarray.end();++iter) {cout << "  " << * iter ;}cout << endl;cout << "myarray.size = " << myarray.size() << endl;
}
void func151(initializer_list<string> myarraystr) {//遍历形参,类似于迭代器的遍历for (auto iter = myarraystr.begin(); iter != myarraystr.end(); ++iter) {cout << "  " << (*iter).c_str();}cout << endl;cout << "myarraystr.size = " << myarraystr.size() << endl;
}void main() {initializer_list<int> myarray;//就看成一个数组了,元素类型是int。initializer_list<int> myarray2 = { 12,16,18,80,90 };//一共5个元素//要注意的是 myarray 或者myarray2中的元素永远都是常量值。func150(myarray2);func151({"nihao","china"});cout << "duandian" << endl;//12  16  18  80  90//	myarray.size = 5//	nihao  china//	myarraystr.size = 2//	duandian
}

上述代码中值的说一下的地方:

C++11使用大括号里面放值,做为一种比较通用的初始化方式,可用于很多的类型。

begin() 和 end()方法类似于 迭代器的

2. initializer_list 拷贝和赋值 不会额外生成一份,是共享的

initializer_list 是个类模版,具体case就是一个类对象,那么这个类对象肯定也是可以拷贝和赋值的

copy 和 赋值 都不会 重新copy一份,而是原来的 mystr 和 mystr1共享一份,mystr 和 mystr2共享一份

	// copy 和 赋值 都不会 重新copy一份,而是原来的 mystr 和 mystr1共享一份,mystr 和 mystr2共享一份initializer_list<string> mystr = {"nihao","china","zhenxing"};initializer_list<string> mystr1(mystr);initializer_list<string> mystr2;mystr2 = mystr;//debug发现  mystr mystr1 mystr2 中里面的string内容的地址都是一致的//	mystr[原始视图] = { _First = 0x008ffdac "nihao" _Last = 0x008ffe00 < 字符串中的字符无效。 > }//	mystr1[原始视图] = { _First = 0x008ffdac "nihao" _Last = 0x008ffe00 < 字符串中的字符无效。 > }//	mystr2[原始视图] = { _First = 0x008ffdac "nihao" _Last = 0x008ffe00 < 字符串中的字符无效。 > }cout << "duandian" << endl;

3.initializer_list 初始化列表做构造函数参数

class Teacher158 {
public:explicit Teacher158(const initializer_list<int> &temvalue) {cout << "duandian1" << endl;}Teacher158(string str) {}};void main() {cout << "111" << endl;Teacher158 tea(); //是一个函数声明,它声明了一个名为 tea 的函数,返回类型为 Teacher158cout << "222" << endl;Teacher158 tea1({1,2,3});Teacher158 tea3{ 100000,2000000,3000000 };//Teacher158 tea2 = { 4,5,66666666 };//隐式类型转换,还是会调用构造函数。//如果我们想禁止 隐式类型转换,需要在构造方法前面加上 explicit
}

三 省略号形参(...)  省略号形参一般无法正确处理类类型对象,在C++要少用,最好不要用,这里写出来是为了知识点的完整。

 省略号形参(...) 也是可以变参数函数。能正确的处理int ,char *;

虽然这种参数数量不固定,但是函数的所有参数是存储在线性的连续的栈空间的。

而且这种可变参数函数必须至少有一个普通参数,我们就可以通过这个普通参数来寻址后续的所有可变参数的类型以及值。

需要包含头文件 #include <stdarg.h>

#include <stdarg.h>//需要用到 stdarg.h中的几个宏
double func159(int num, ...) {//一般num里面传递进来的是可变参数的数量。va_list valist;//创建一个 va_list类型的变量,按f12 看va_list 实际上是 char*//该函数的目的是计算传递进来的 可变参数的和double sum = 0;va_start(valist, num);//使valist指向起始的参数for (int i = 0; i < num; ++i) {sum = sum + va_arg(valist, int);//va_arg是个宏,va_arg宏的第二个参数表明 func159函数除第一个参数外,都是int//该宏用于变参数函数调用过程中,type是当前参数类型,调用该宏后,ap指向变参数列表中的下一个参数,返回ap指向的参数值,是一个类型为type的表达式。}va_end(valist);//释放valistreturn sum;
}void main() {cout << func159(5, 100, 200, 300, 400, 500) << endl;
}

注意说明:

1. 至少有一个有效的形参,形参不能全部是...

2.三个.只能出现在形参列表的最后一个位置

3,三个.之前的,是可以省略的

4,如果有多个普通参数,那么va_start(valist, num)中的num,必须是...紧前面的那个

5,一般只能处理 数值型 或者char * 型,遇到类类型不能正常处理

6.在C++中不建议使用,能看懂就行

相关文章:

116 C++ 可变参数函数,initializer_list (初始化列表), 省略号形参

一 可变参数函数 有时候我们传递的参数是不固定的。 这种能接受非固定个数参数的函数就是可变参数函数 怎么实现呢&#xff1f;就要用到 initializer_list 标准库类型 该类型能够使用的前提条件是&#xff1a;所有的实参类型相同。 二&#xff0c;initializer_list(初始化列…...

强国有我社会实践公益活动在合肥市庐阳区开展

2月18日是开工第一天&#xff0c;阳光灿烂、春光明媚。合肥市四十五中2022级星辰&#xff08;5&#xff09;班部分同学在监护人的陪伴下来到庐阳区双岗街道万小店社区残疾人工作站&#xff0c;和工作站兄弟姐妹们共同开展“强国复兴有我”社会实践公益活动。合肥市庐阳区为民社…...

Nginx 正向代理、反向代理

文章目录 前言1. 正向代理1.1 概念1.2 逻辑图1.3 使用场景 2. 反向代理2.1 概念2.2 逻辑图2.3 使用场景 前言 正向代理主要是用来解决访问限制问题&#xff1b;反向代理则是提供负载均衡、安全防护等作用 1. 正向代理 1.1 概念 正向代理是一个位于客户端和目标服务器之间的代理…...

软考学习--计算机组成原理与体系结构

计算机组成原理与体系结构 数据的表示 进制转换 R 进制转换为 10 进制–按权展开法 10进制转换为2进制 原码 反码 补码 移码 原码 &#xff1a;数字的二进制表示反码 &#xff1a; 正数的反码等于原码&#xff0c;负数的反码等于原码取反补码&#xff1a; 正数的补码等…...

fish终端下conda activate失败

【问题】fish终端下激活conda环境报错&#xff1a; >> conda activate base CondaError: Run conda init before conda activate ## 然而运行 conda init fish 仍旧无法解决【解决】 参考&#xff1a;https://github.com/conda/conda/issues/11079 方法一&#xf…...

FPGA之移位寄存器

SLICEM中的LUT可以配置为32位移位寄存器,而无需使用slice中可用的触发器。以这种方式使用,每个LUT 可以将串 行数据延迟 1 到 32 个时钟周期。移入D &#xff08;DI1 LUT 引脚&#xff09;和移出 Q31&#xff08;MC31 LUT 引脚&#xff09;线路将LUT级联&#xff0c;以形成更大…...

Android Compose Material3 ModalNavigationDrawer 抽屉的使用(处理了一些坑)

Android Compose Material3 ModalNavigationDrawer 抽屉的使用&#xff08;处理了一些坑&#xff09; val drawerState rememberDrawerState(initialValue DrawerValue.Closed) val scope rememberCoroutineScope()ModalNavigationDrawer(drawerState drawerState,drawerC…...

golang select两个channel性能稳定,三个channel时性能会发生抖动,为什么?

golang select两个channel性能稳定&#xff0c;三个channel时性能会发生抖动&#xff0c;为什么&#xff1f; 答题思路 select —> 让 Goroutine同时等待多个 Channel 可读或者可写 —> Goroutine —> 调度器调度 —> 资源竞争 —> 不稳定、抖动 在 Go 中&#…...

VSCODE上使用python_Django

接上篇 https://blog.csdn.net/weixin_44741835/article/details/136135996?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136135996%22%2C%22source%22%3A%22weixin_44741835%22%7D VSCODE官网&#xff1a; Editing Python …...

探索IDE的世界:什么是IDE?以及适合新手的IDE推荐

引言 在编程的世界里&#xff0c;集成开发环境&#xff08;IDE&#xff09;是我们日常工作的重要工具。无论是初学者还是经验丰富的开发者&#xff0c;一个好的IDE都能极大地提高我们的编程效率。那么&#xff0c;什么是IDE呢&#xff1f;对于新手来说&#xff0c;又应该选择哪…...

DoRA(权重分解低秩适应):一种新颖的模型微调方法

来自&#xff1a;小互 DoRA&#xff08;权重分解低秩适应&#xff09;&#xff1a;一种新颖的模型微调方法 DoRA在LoRA的基础上进一步发展&#xff0c;通过将预训练权重分解为“幅度”和“方向”两个部分进行微调。 这种权重分解方法允许DoRA更精细地控制模型的学习过程&…...

centos7.9 搭建k8s

K3s -轻量级Kubernetes K3s 是轻量级的 Kubernetes。K3s 易于安装&#xff0c;仅需要 Kubernetes 内存的一半&#xff0c;所有组件都在一个小于 100 MB 的二进制文件中。 为什么叫 K3s? 我们希望安装的 Kubernetes 只占用一半的内存。Kubernetes 是一个 10 个字母的单词&am…...

使用vite创建项目

NPM npm create vitelatest Yarn yarn create vite PNPM pnpm create vite Bun bunx create-vite 安装sass npm add -D sass 安装less npm add -D less vite官方中文文档&#xff1a;Vite | 下一代的前端工具链 (vitejs.dev)...

EXTI外部中断

&#xff1f; 难点&#xff1a;中断向量表、看门狗、NVIC的优先级位&#xff1f;EXTI框图&#xff1f; ------------------------ 中断系统 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;--->例如&#xff1a;…...

小肥柴慢慢手写数据结构(C篇)(5-4 中场小结)

小肥柴慢慢学习数据结构笔记&#xff08;C篇&#xff09;&#xff08;5-4 中场小结&#xff09; 目录5-14 再看数据结构的基础问题5-15 接下来关于Tree你还需要学习和了解的内容参考文献和资料 目录 5-14 再看数据结构的基础问题 假设前面讨论的所有内容大家都已经自己编码实…...

flutter 功能

flutter功能 带缓存的tab切换功能 使用PageController进行对应tab的widget缓存 late PageController _keepActiveVC;///当前使用的视图索引late int _index;late PageController _keepActiveVC;/// 所有视图final List<Widget> _bodys [];overridevoid initState() {…...

Sql Server 存储过程

一、创建存储过程 USE [数据库名称] GO /****** Object: StoredProcedure [dbo].[存储过程名称] Script Date: 2024/2/19 9:47:49 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- -- Author: <Author,,Name> -- Create date: <Create Dat…...

二.重新回炉Spring Framework:Spring Framework主要组件概览

1.写在前面的话 这里主要简单说一下Spring Framework的几个核心组件的总体情况。为了比较直观&#xff0c;这里使用了ClassPathXmlApplicationContext的类图来进行说明。它基本上包含了 IoC 体系中大部分的核心类和接口。类图如下图所示&#xff1a; 2.Resource 组件体系 R…...

Open CASCADE学习|曲线向曲面投影

在三维空间中&#xff0c;将曲线向曲面投影通常涉及复杂的几何计算。这个过程可以通过多种方法实现&#xff0c;但最常见的是使用数学和几何库&#xff0c;如OpenCASCADE&#xff0c;来处理这些计算。 在OpenCASCADE中&#xff0c;投影曲线到曲面通常涉及以下步骤&#xff1a;…...

怎样连接局域网?

局域网&#xff08;Local Area Network&#xff0c;缩写为LAN&#xff09;是建立在小范围内的计算机网络&#xff0c;用于连接同一建筑物或者办公场所内的设备。连接局域网可以实现设备之间的信息共享和远程通信。本文将介绍如何连接局域网&#xff0c;并介绍了天联组网天联的使…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...