当前课程知识点:C++语言程序设计基础 > 第3章 函数 > 含有可变参数的函数 > 含有可变参数的函数
含有可变参数的函数
C++标准中提供了两种主要的方法
如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型;
如果实参的类型不同,我们可以编写可变参数的模板(第9章)。
initializer_list
initializer_list是一种标准库类型,用于表示某种特定类型的值的数组,该类型定义在同名的头文件中
initializer_list是一个类模板(第9章详细介绍模板)
使用模板时,我们需要在模板名字后面跟一对尖括号,括号内给出类型参数。例如:
initializer_list<string> ls; // initializer_list的元素类型是string
initializer_list<int> li; // initializer_list的元素类型是int
initializer_list比较特殊的一点是,其对象中的元素永远是常量值,我们无法改变initializer_list对象中元素的值。
含有initializer_list形参的函数也可以同时拥有其他形参
在编写代码输出程序产生的错误信息时,最好统一用一个函数实现该功能,使得对所有错误的处理能够整齐划一。然而错误信息的种类不同,调用错误信息输出函数时传递的参数也会各不相同。
使用initializer_list编写一个错误信息输出函数,使其可以作用于可变数量的形参。
大家好
欢迎继续学习C++语言程序设计
我想大家学会了写函数以后
可能就会觉得
我是不是能够写一个
参数个数不确定的函数呢
这个确实是编程中
是很重要的一个需求
用我们此前学的办法
是没有办法解决这个问题的
因为你在定义一个函数的时候
把它的形参表就确定好了
实际上呢
在C++新标准中
为我们提供了很方便的一个途径
让我们可以定义
可变长度的形参表
接下来
我们就来看从语法上
如何实现一个可变长度的形参表
现在我们来看一下
含有可变参数的函数
它的语法规定
那么C++标准中
提供了两种主要的方法
来实现这个参数长度的可变
那么一个方法就是
当所有的参数类型相同的时候
可以传一个名为
initializer_list的这种
标准库的类型对象
那么如果说
参数的类型是不同的
那我们就不能用这种办法了
我们可以用第九章要讲的
这个可变参数模板
那么这个initializer_list
是一种标准库里面的类型
它实际上也是一个类模板
可以用于表示
某种特定的类型值的数组
这个类型定义在同名的头文件中
也就是说
你要include initializer_list
这个头文件才可以
这个表给出了
initializer_list所提供的
这些主要的有用的操作
大家可以看一下
也可以尝试着去用一下
使用这个initializer_list
这个模板的时候
我们需要在模板名字后面
跟一对尖括号
那么括号里面要给出类型参数
那大家看这几个例子
比如说这儿
我们在类型参数中给出了string
那么表示这个
initializer_list元素类型都是string
也就是说
它包括了一组string
构成的参数表
那第二个呢
我们看到可以用int来作类型参数
这个模板呢
我们将在第九章介绍
现在我们只要学着这个样子
这么用就可以了
那么这个initializer_list
比较特殊的一点呢
是其中的对象的元素
永远是常量值
我们没有办法去改变
initializer对象中的元素值
那一个函数的形参表中
可能会有一组
长度不定的同类型的参数
也可能除此而外
还有其他类型的参数
这也是可以的
所以含有initializer_list形参的
这个函数也可以同时
拥有其他的形参
那么在编写代码的时候
比如说我们可能希望
要生成这个错误信息
去告诉用户现在出了什么错了
那我们就希望这个程序中
是不是可以用同一个函数
去实现这个功能
那么这个就是initializer_list
一个很好的应用场景的例子
那么这个时候呢
我们就要用同一个函数
来实现错误信息输出
可是又是针对不同的问题
那么不同的问题
它出现错误的时候
这个错误信息长度可能也不一样
它的参数个数可能也不一样
这个时候怎么办呢
我们就恰好可以用
initializer_list去定制这个错误
处理函数它的参数长度
在运行时
根据实参去定制它
-导学
--第1章导学
-计算机系统简介
--计算机系统简介
--计算机系统简介 测试题
-计算机语言和程序设计方法的发展
--计算机语言和程序设计方法的发展 测试题
-面向对象的基本概念
--面向对象的基本概念 测试题
-程序的开发过程
--程序的开发过程
--程序的开发过程 测试题
-信息的表示和储存
--计算机的数字系统
--数据的编码表示
--信息的表示和储存 测试题
-实验指导
-导学
--第二章导学
-C++语言概述
--C++语言概述 测试题
-基本数据类型、常量、变量
--程序举例
--基本数据类型、常量、变量 测试题
-运算与表达式
--运算与表达式 测试题
-实验二:简单程序设计(上)
-数据的输入和输出
--数据的输入和输出
--数据的输入和输出 测试题
-选择结构
--if语句
--switch语句
--选择结构 测试题
-循环结构
--for语句
--循环结构 测试题
-自定义类型
--自定义类型
--自定义类型
-第2章小结
--第二章小结
-实验二:C++简单程序设计(下)
-导学
--导学
-函数定义
--函数定义
--函数定义 测试题
-函数调用
--例3-2
--例3-3
--例3-4
--例3-5
--例3-6
--函数调用 测试题
-嵌套与递归
--例3-9
--例3-10
--嵌套与递归 测试题
-函数的参数传递
--函数的参数传递
--函数的参数传递 测试题
-引用类型
--引用类型 测试题
-含有可变参数的函数
--含有可变参数的函数 测试题
-内联函数
--内联函数 测试题
-constexpr函数
--CONSTEXPR函数课后习题
-带默认参数值的函数
--带默认参数值的函数 测试题
-函数重载
--函数重载 测试题
-C++系统函数
--C++系统函数习题
-第3章小结
--第三章小结
-实验三(上)函数的应用
-实验三(下)函数的应用
-导学
--导学
-面向对象程序的基本特点
--面向对象程序的基本特点 测试题
-类和对象
--类和对象的定义
--类和对象 测试题
-构造函数
--构造函数基本概念
--委托构造函数
--复制构造函数
--构造函数 测试题
-析构函数
--析构函数
--析构函数 测试题
-类的组合
--类的组合
--类的组合程序举例
--前向引用声明
--类的组合 测试题
-UML简介
--UML简介
--UML简介课后习题
-结构体与联合体
--结构体与联合体 测试题
-枚举类
--枚举类
--枚举类 测试题
-第4章小结
--第四章小结
-实验四(上)
--实验四(上)
-实验四(下)
--实验四(下)
-导学
--导学
-标识符的作用域与可见性
--标识符的作用域与可见性 测试题
-对象的生存期
--对象的生存期
--对象的生存期 测试题
-类的静态成员
--类的静态成员 测试题
-类的友元
--类的友元 测试题
-共享数据的保护
--共享数据的保护 测试题
-多文件结构和预编译命令
--多文件结构和预编译命令 测试题
-第5章小结
--小结
-实验五
--实验五
-导学
--导学
-数组的定义与初始化
--数组的定义与使用
--一维数组应用举例
--数组的定义与初始化 测试题
-数组作为函数的参数
--数组作为函数的参数 测试题
-对象数组
--对象数组
--对象数组 测试题
-基于范围的for循环
-指针的定义和运算
--指针的定义和运算 测试题
-综合实例
--综合实例
-实验六(上)
--实验六上
-指针与数组
--指针数组
--指针与数组 测试题
-指针与函数
--指针类型的函数
--指向函数的指针
--指针与函数 测试题
-对象指针
--对象指针
--对象指针 测试题
-动态内存分配
--动态内存分配 测试题
-智能指针
--智能指针
-vector对象
--vector对象
--vector对象 测试题
-对象复制与移动
--移动构造
--对象复制与移动 测试题
-字符串
--C风格字符串
--string类
--字符串 测试题
-第6章小结
--第六章小结
-综合实例
--综合实例
-实验六(下)
--实验六(下)