> 文章列表 > 函数的参数

函数的参数

函数的参数

函数的默认实参

函数默认参数:函数的形参可以有默认值,如果我们自己传入参数,就用自己的数据,如果没有,那么用默认值

特别注意*: 如果某个位置有了默认参数,那么从这个位置往后,必须要有默认值,即默认参数要放在最后

知识扩展*:当我们调用有默认参数的函数时,可以不写实参

func(int a,int b=100);
不能写成
func(int a,int b=200,int c)
func(int a,int& b=100)

这里b的引用不能赋值为199,因为引用本质上就是简化版的指针

不定量参数

1.将cmd发送快捷方式到桌面

2.修改文件起始位置为工程目录

 这样我们就能直接在这个控制台运行我们写好的程序、

知识扩展*:修改生成文件名 afei

右键工程->属性->常规->目标文件名

main函数的另一面

int main(int argcount,char*  c_arg[])

argcount表示参数个数,c_arg[]表示储存的参数

c_arg[0]储存的一定是文件名

c_arg[]最后储存的一定是空指针,为什么是空指针呢?因为它储存的参数本质上就是储存的字符串格式,只是以空格分开

接受不定量参数的函数

int func(int count ,...)    参数后面跟的是省略号

使用这函数要加头文件<cstdarg>

如何获取参数

va_list arg   定义一个指针。也可以写成char* arg,va_list就是一个char*

va_start(arg,count)   得到参数的地址

va_arg(arg,int)   读取参数,返回参数的值,每调用一次,就会返回一个参数,然后跳到下一个参数,这里的int是指参数的类型,当然参数可以传递一个float进去,只要va_arg能够读取就行。

va_end(arg) 释放arg的内存

int func(int count,...)
{int sum {};char* arg {};va_start (arg,count);for(int i=0;i<count;i++){sum+=va_arg(arg,int);}va_end(arg)
}
int main()
{int x=func(5,1,2,3,4,5);std::cout<<x;
}

这里输出了15

arg底层实现

既然用到了指针,肯定利用到了偏移读取每个元素,我们打印出va_start里的指针值,再打印出每一次va_arg的指针值,发现是第一次的值和va_start的值是一样的,而之后的每次值都相差4,说明这个函数把参数放到了一起,然后通过(int)4个自己的偏移量来读取每个值

自己实现不定量参数

struct Sarg
{int count;char* ptr;
};
int add(Sarg& a)
{int sum = 0;int* fp = (int*)a.ptr;for(int i=0;i<a.count;i++){sum += fp[i]; }return sum;
};
int main()
{Sarg a;a.count = 5;a.ptr = (char*)new int[5]{ 1,2,3,4,5 };std::cout << add(a);system("pause");
}

第20行必须要转成char*才能赋值,所以第九行又要把它赚回来,add参数为引用是为了节省内存