C++程序员应了解的那些事(47)函数之 传入传出参数 / 默认参数
一、传入传出参数基本概念
C++ 中的参数,既可以当做传入参数,也可以当做传出参数,具体要看参数的数据类型。
①非指针,非引用类型:一定是当做传入参数;
②指针,引用类型:既可以当做传入参数;也可以当做传出参数;甚至可以同时是传入参数,也是传出参数。
其次要看对参数进行的操作:
如果是只有读取,没有修改的,那就是传入参数,这时可以加上 const 限定符,以防不小心修改了参数。
如果只有对参数进行写入,没有读取的,那就是当做传出参数的。
如果对参数先进行了读取操作,然后又进行了写入操作,那么就是既当传入参数也当传出参数了。、
<示例>
int func(int num1, int *num2)
{
*num2 = 5;
return num1 + *num2;
}
其中,num1位传入参数,num2为传出参数。
传入参数本身有值,传入函数让函数使用; 传出参数本身没值,从函数中带出值(相当于函数的返回值)。
如何实现一个传出参数?
定义一个变量,将这个变量的地址传过去,在函数中实现对这个变量的操作。
函数如何返回多个值?
使用传出参数,可以实现返回多个值。
二、C++默认参数设置(1)默认参数的使用:定义默认参数时,必须放在函数声明里,并且默认参数不得出现在函数定义中。
(2)默认参数的顺序应该怎么定义?
※ 定义默认参数的方向:从右到左,不能跳跃☆☆☆
※ 匹配参数的方向:从左到右☆☆☆
※ 调用函数时,用户自定义的实参至少和向左来的已定义默认参数的形参相邻,函数才能被成功调用。
(3)默认参数和重载函数容易混淆!!!
eg.
int fn( int a)
int fn(int a,int b=2)
int fn( int a,int b=2,int c=6)
如果调用函数fn(1)的时候,程序可以默认省略了其它两个参数,可以调用第一个,第二个,第三个,同理如果调用函数fn(1,1)可以调用第二个和第三个函数,从而导致错误。
三、Linux 网络编程中的传入传出参数
在 Linux 网络编程中的传入传出参数也被称为值-结果参数,
当往一个套接字函数传递一个套接字地址结构时,该结构总是以引用形式来传递,也就是说传递的是指向该结构的一个指针。该结构的长度也作为一个参数来传递,不过其传递方式取决于该结构的传递方向:进程->内核 内核->进程
(1)进程->内核 传递套接字地址结构的函数有3个:bind、connect、sendto
这些函数的一个参数是指向某个套接字地址结构的指针,另一个参数是该结构的整数大小。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
(2)内核->进程 传递套接字地址结构的函数有4个:accept、recvfrom、getsockname、getpeername
这4个函数的其中2个参数是指向某个套接字地址结构的指针和指向表示该结构大小的整数变量的指针。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
把套接字地址结构大小这个参数从一个整数改变为指向某个整数变量的指针,其原因:
当函数被调用时,结构大小是一个值,进程告诉内核该结构的大小,这样内核在写该结构时不至于越界;
当函数返回时,结构大小又是一个结果,应用进程可以知道内核在该结构体究竟存储了多少信息。
这种类型的参数称为:值-结果参数
下一篇: 深度学习-数据增广