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 (初始化列表), 省略号形参
一 可变参数函数 有时候我们传递的参数是不固定的。 这种能接受非固定个数参数的函数就是可变参数函数 怎么实现呢?就要用到 initializer_list 标准库类型 该类型能够使用的前提条件是:所有的实参类型相同。 二,initializer_list(初始化列…...
强国有我社会实践公益活动在合肥市庐阳区开展
2月18日是开工第一天,阳光灿烂、春光明媚。合肥市四十五中2022级星辰(5)班部分同学在监护人的陪伴下来到庐阳区双岗街道万小店社区残疾人工作站,和工作站兄弟姐妹们共同开展“强国复兴有我”社会实践公益活动。合肥市庐阳区为民社…...
Nginx 正向代理、反向代理
文章目录 前言1. 正向代理1.1 概念1.2 逻辑图1.3 使用场景 2. 反向代理2.1 概念2.2 逻辑图2.3 使用场景 前言 正向代理主要是用来解决访问限制问题;反向代理则是提供负载均衡、安全防护等作用 1. 正向代理 1.1 概念 正向代理是一个位于客户端和目标服务器之间的代理…...
软考学习--计算机组成原理与体系结构
计算机组成原理与体系结构 数据的表示 进制转换 R 进制转换为 10 进制–按权展开法 10进制转换为2进制 原码 反码 补码 移码 原码 :数字的二进制表示反码 : 正数的反码等于原码,负数的反码等于原码取反补码: 正数的补码等…...
fish终端下conda activate失败
【问题】fish终端下激活conda环境报错: >> conda activate base CondaError: Run conda init before conda activate ## 然而运行 conda init fish 仍旧无法解决【解决】 参考:https://github.com/conda/conda/issues/11079 方法一…...
FPGA之移位寄存器
SLICEM中的LUT可以配置为32位移位寄存器,而无需使用slice中可用的触发器。以这种方式使用,每个LUT 可以将串 行数据延迟 1 到 32 个时钟周期。移入D (DI1 LUT 引脚)和移出 Q31(MC31 LUT 引脚)线路将LUT级联,以形成更大…...
Android Compose Material3 ModalNavigationDrawer 抽屉的使用(处理了一些坑)
Android Compose Material3 ModalNavigationDrawer 抽屉的使用(处理了一些坑) val drawerState rememberDrawerState(initialValue DrawerValue.Closed) val scope rememberCoroutineScope()ModalNavigationDrawer(drawerState drawerState,drawerC…...
golang select两个channel性能稳定,三个channel时性能会发生抖动,为什么?
golang select两个channel性能稳定,三个channel时性能会发生抖动,为什么? 答题思路 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官网: Editing Python …...
探索IDE的世界:什么是IDE?以及适合新手的IDE推荐
引言 在编程的世界里,集成开发环境(IDE)是我们日常工作的重要工具。无论是初学者还是经验丰富的开发者,一个好的IDE都能极大地提高我们的编程效率。那么,什么是IDE呢?对于新手来说,又应该选择哪…...
DoRA(权重分解低秩适应):一种新颖的模型微调方法
来自:小互 DoRA(权重分解低秩适应):一种新颖的模型微调方法 DoRA在LoRA的基础上进一步发展,通过将预训练权重分解为“幅度”和“方向”两个部分进行微调。 这种权重分解方法允许DoRA更精细地控制模型的学习过程&…...
centos7.9 搭建k8s
K3s -轻量级Kubernetes K3s 是轻量级的 Kubernetes。K3s 易于安装,仅需要 Kubernetes 内存的一半,所有组件都在一个小于 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官方中文文档:Vite | 下一代的前端工具链 (vitejs.dev)...
EXTI外部中断
? 难点:中断向量表、看门狗、NVIC的优先级位?EXTI框图? ------------------------ 中断系统 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源)--->例如:…...
小肥柴慢慢手写数据结构(C篇)(5-4 中场小结)
小肥柴慢慢学习数据结构笔记(C篇)(5-4 中场小结) 目录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的几个核心组件的总体情况。为了比较直观,这里使用了ClassPathXmlApplicationContext的类图来进行说明。它基本上包含了 IoC 体系中大部分的核心类和接口。类图如下图所示: 2.Resource 组件体系 R…...
Open CASCADE学习|曲线向曲面投影
在三维空间中,将曲线向曲面投影通常涉及复杂的几何计算。这个过程可以通过多种方法实现,但最常见的是使用数学和几何库,如OpenCASCADE,来处理这些计算。 在OpenCASCADE中,投影曲线到曲面通常涉及以下步骤:…...
怎样连接局域网?
局域网(Local Area Network,缩写为LAN)是建立在小范围内的计算机网络,用于连接同一建筑物或者办公场所内的设备。连接局域网可以实现设备之间的信息共享和远程通信。本文将介绍如何连接局域网,并介绍了天联组网天联的使…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
