1. 可变参数函数

C++允许定义形参个数和类型不确定的函数,不确定的形参可以使用省略号“…”。

int  add(int firstParam,  … )

使用可变参数函数时注意:

省略号必须在参数列表的末尾。

运行时,才能确认参数的具体个数与类型。

只能顺序访问可变参数,无法后退访问

无法提供任何安全性保证

如果使用省略号,传递可变数量的参数时使用va_arg、va_start、va_end 和 va_list等宏,定义在中(c中定义在)。

va_start(args,paramN) 令对可变函数参数的访问可行。

第一个参数为va_list类型的变量

第二个参数为"..."前最后一个参数

将args初始化为指向可变参数列表第一个参数

va_arg(args,type)  访问下一个可变函数参数。

第一个参数为va_list类型的变量

第二个参数是返回值的类型

调用va_arg获取当前的参数,并自动更新指向下一个可变参数

va_end(args)  结束可变参数函数的遍历。

释放va_arg变量

代码示例如下:

#include#includeusing namespace std;

//求和函数

int add(int firstParam, ...)

{

va_list arg_ptr;

int sum = 0;

int nArgValue;

sum += firstParam;

va_start(arg_ptr, firstParam);

do

{

nArgValue = va_arg(arg_ptr, int);

sum += nArgValue;

} while (nArgValue != 0);

va_end(arg_ptr);

return sum;

}

int main()

{

cout << add(1, 2, 3, 0) << endl; //运行结果:6

system("pause");

}

2. 可变参数模板

可变参数模板(variadic template)是支持可变数量参数的类模板或函数模板。可变数目的参数被称为参数包(parameter packet)。

2.1 可变参数类模板

可变参数类模板定义语法的基本示例:

templateclass classname;

// Arguments 是参数包。 类 classname 可以接受参数数目可变。

代码示例如下:

#include#includeusing namespace std;

templateclass Tuple

{

};

Tuple<> t0;

Tuplet1;

Tuplet2;

2.2 可变参数函数模板

可变参数模板函数语法的基本示例:

template returntype functionname(Arguments... args);

代码示例如下:

#include#includeusing namespace std;

//用来终止递归并处理包中最后一个元素

templatevoid print(const T& t)

{

cout << t;

}

templatevoid print(const T& t, const Args&...rest)

{

cout << t << " "; //打印第一个实参

print(rest...); //递归调用,打印其它实参

}

int main()

{

print("Harris", 2, 3.14f, "April", 42); //输出:"Harris" 2 3.14f "April" 42

cout << endl;

return 0;

}

3. Variadic 宏

Variadic 宏是参数个数可变的宏,省略号可以被指定为正式自变量,并且替换标识符 __VA_ARGS__。

#include#include#define LOGSTRINGS(fm,...) printf(fm,__VA_ARGS__)

int main()

{

LOGSTRINGS("hello,%d",10); //输出:hello,10

return 0;

}

4. try、throw 和 catch 语句

C++ 中实现异常处理使用 try、throw 和 catch 表达式。try 是代码的受保护部分。throw 引发异常,catch 块根据异常类型处理异常。catch(...)一般用来捕获一些意想不到的异常。

4.总结

若非必要,不要使用可变参数函数。应该首先考虑函数重载等其他方法。

除非需要兼容C语言编译器,否则不要使用可变参数宏。因为这种方法最不安全;尤其是当参数为对象时这种方法易产生各种问题。毕竟这些宏是为C语言设计的,C语言中没有对象。

可变参模板看似最为强大。参数的类型可以不同、比可变参数宏更加安全并且可以自动推断参数类型和参数个数。但考虑到模板会为每一个不同的实例生成代码,如果函数的实例过多可能会使代码体积增大。另外,依靠递归使得功能具有局限性,并且效率也会受到影响

c语言函数的省略号,c++中的省略号相关推荐

  1. 分段函数if语句_C语言函数系列之库函数中基础必会函数(一)

    !!!阅前提醒:!!! 此文为c语言函数系列的第一篇,全系列字数将达到1w字以上且全为干货内容,请各位仔细阅读并打开编译器运行文章中出现的代码进行试验以确保能理解文章内容 if判断函数(以图中显示代码 ...

  2. C语言函数题- 删除字符串中下标为i的字符

    6-2 删除字符串中下标为i的字符 (10分) 本题要求实现一个函数,删除字符串中的下标为i的字符,i的值保证合法,即字符串一定存在下标为i的字符. 函数接口定义: void delstring ( ...

  3. 以下对c语言函数的描述中正确的是,以下对C语言函数的有关描述中,正确的是

    摘要: 它决习定于的学后天,下语密切关系的能与社力是会文化有.关描透性的是起渗利尿可引.认的r默链接路径是(,述中在建点时立站.... 它决习定于的学后天,下语密切关系的能与社力是会文化有. 函数人感 ...

  4. 以下对c语言函数的描述中 错误的是,以下对C语言函数的有关描述中,正确的是....

    [填空题]对网络性能进行评估时,下语需要明确的主要性能指标是 ( 1 ) ,下语除了可用理论方法进行分析外,更多地需要实际测量,主要的测量方法是 ( 2 ) . (1)A.实际数据率 B.丢包率 C ...

  5. 汇编和c语言函数的参数传递,C51中汇编的使用及参数传递与数据返回

    博文原址:http://blog.163.com/liujie_267/blog/static/874692172010612461343/ 1.在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: ...

  6. c语言函数申请内存,c中动态内存申请的函数

    C语言中,内存管理是通过专门的函数来实现的. (1)malloc函数: 用于分配若干字节的内存空间,并返回一个指向该内存空间首地址的指针变量. 若系统不能提供足够的内存单元,将会返回一个NULL,空指 ...

  7. c语言函数向量,引用C中函数返回的向量元素

    是的,确实做错了.你打电话的时候: return v; 正在创建对象v的临时副本 const int &myIntRef = f()[0]; 使用此临时副本的第一个元素初始化您的引用.在此行之 ...

  8. 函数参数中带省略号的用法

     [转]函数参数中带省略号的用法 本文摘自CDSN<可变参数学习笔记>,原帖链接:http://topic.csdn.net/t/20041124/09/3582660.html 前言 ...

  9. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义函数在三线表中添加p值

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.编写自定义函数在三线表中添加p值 目录

  10. 三线表是什么?R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)、编写自定义函数在三线表中添加p值

    三线表是什么?R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.编写自定义三线表结构(将因子变量细粒度化重新构建三线图).编写自定义函数在三线表中添加p值 目录

最新文章

  1. bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治
  2. mysql ansi quotes_mysql ANSI_QUOTES 这个sql_mode的作用(字段可以使用双引号)
  3. 坦克大战c语言程序贴吧,坦克大战!
  4. 关于iframe中session 失效问题
  5. laravel mysql增删改查_Laravel框架数据库操作的增删改三种方式 阿星小栈
  6. 【bfs】极其简单的最短路问题
  7. tomcat bug之部署应用的时候经常会发上startup failed due to previous errors
  8. python中string.digits_Python string.hexdigits方法代码示例
  9. iconv命令的使用,解决libxml2中解释中文失败的问题
  10. 机器视觉——鱼眼相机成像模型
  11. msvcp110d.dll 丢失问题原因及解决思路
  12. 恶魔的指纹---49幅由算法生成的七芒星图像
  13. [情感]富裕的女人守不住爱情
  14. c++ 接口继承和实现继承
  15. 通过有向图的可达矩阵判断有向图的连通类型
  16. 幼儿抽象逻辑思维举例_幼教科目二 | 幼儿认知的发展(思维)
  17. mysql课设体会_课程设计心得体会8篇
  18. HTML选择器的学习
  19. php文字添加投影,视频加动态标题文字 视频标题文字添加阴影边框 给视频加上炫酷的文字标题...
  20. 20200929 008.海龟绘图_画出奥运五环图

热门文章

  1. ECS(Entity-Component-System)是什么?
  2. 润乾报表V4在weblogic下部署找不到授权文件的解决方法
  3. 金属类的大宗商品创下新高,对冲基金疯狂买涨
  4. linux at任务不运行,linux中at的使用-计划任务
  5. 用UCWEB浏览器上网 省流量小技巧
  6. amap高德地图应用(el-amap-marker坐标点;el-amap-info-window信息窗体;el-amap-polyline折线、折线颜色,宽度、实虚线等)
  7. iOS开发打字机效果
  8. python实现排列组合
  9. js利用数组创建图片对象
  10. 读Java 804 - Quick refresher