main函数形参、可变形参函数

main:处理命令行选项

int main(int argc,char *argv[]) {……}

第一个形参argc表示数组中字符串的数量,第二个形参argv是一个数组,因为第二个形参是一个数组,所以main函数也可以定义为:

int main(int argc,char**argv) {……}

其中,argv指向char*。

当实参传给main函数之后,argv的第一个元素指向程序的名字或者一个空字符串,接下来的元素依次传递给命令行提供的实参,最后一个指针之后的元素保证为0。

当使用argv中的实参时,一定要记得可选实参是从argv[1]开始,argv[0]保存程序的名字,而非用户输入。

含有可变形参的函数

为了编写处理不同实参的函数,C++11新标准提供了两种主要的方法:如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型;如果实参的类型不同,则可以编写可变参数模板。

C++还有一种特殊类型的形参即省略符,可以用它传递可变参数的实参,不过这种功能一般用于与C函数交互的接口程序。

initializer_list形参

如果函数的实参数量未知但是全部实参的类型相同,可以使用initializer_list类型形参。initializer_list是一种标准库类型,用于表示某种特定类型的值的数组。initializer_list定义在同名头文件中。提供如下操作:

initializer_list<T> lst{a,b,c… }

lst的元素数量和初始值一样多;lst的元素是对应初始值的副本;列表中的元素是const

lst2=lst

lst2(lst)

拷贝或赋值一个initializer_list对象不会拷贝列表中的元素;拷贝后,原始列表和副本共享元素

lst.size()

列表中的元素数量

lst.begin()

返回指向lst中首元素的指针

lst.end()

返回指向lst中尾元素下一位置的指针

和vector一样,initializer_list也是一种模板类型,定义initializer_list对象时,必须说明列表中所含元素的类型:

initializer_list<string>ls;
initializer_list<int>li;

与vector对象不一样的是initializer_list中的对象永远是常量值,无法改变initializer_list对象中的元素的值。

使用如下形式编写输出错误信息的函数,使其可以作用于可变数量的实参:

void error_msg(initializer_list<string> il)
{
for(auto beg=il.begin();beg!=il.end();++beg)
cout<<*beg<<“”;
       cout<<endl;
}

若想向initializer_list形参中传递一个值的序列,则必须把序列放在一对花括号内:

if(expected!=actual)
       error_msg({“function”,expected,actual});
else
       error_msg({“function”, “okay”});

含有initializer_list形参的函数也可以拥有其他形参。例如,调试系统可能有个名为ErrCode的类型用来表示不同类型的错误,因此可以改写之前的程序:

void error_msg(ErrCode e,initializer_list<string> il)
{
cout<<e.msg()<<“:”;
for(const auto &elem :il)
       cout<<elem<<“ ”;
cout<<endl;
}

省略符形参

C++ 中的省略符形参是为了编译使用了 varargs 的 C 语言程序。对于 C++ 程序,只能将简单数据类型传递给含有省略符形参的函数。实际上,当需要传递给省略符形参时,大多数类类型对象都不能正确地复制。

在无法列举出传递给函数的所有实参的类型和数目时,可以使用省略符形参。省略符暂停了类型检查机制。它们的出现告知编译器,当调用函数时,可以有 0 或多个实参,而实参的类型未知。省略符形参有下列两种形式:

void foo(parm_list, ...);
void foo(...);

第一种形式为特定数目的形参提供了声明。 在这种情况下, 当函数被调用时,

对于与显示声明的形参相对应的实参进行类型检查, 而对于与省略符对应的实参

则暂停类型检查。在第一种形式中,形参声明后面的逗号是可选的。大部分带有省略符形参的函数都利用显式声明的参数中的一些信息,来获取函数调用中提供的其他可选实参的类型和数目。因此带有省略符的第一种形式的函数声明是最常用的。 

转载于:https://www.cnblogs.com/xiaojianliu/articles/8978715.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值