C++笔记(3):函数的参数和返回值

刚学C++那会,做课程设计的时候总是会去网上很找别人写好的程序来参考,那时候看到函数参数列表里各种复杂的类型和奇怪的写法就头大,后来总算是慢慢搞清楚了,在此对函数各种类型的形参以及函数的返回值进行一下总结。

1.普通形参

传递普通形参也就是值传递,传递的是实际参数的一个副本,当函数被调用时,形参复制实参,也就是说此时形参和实参的值是一样的,但形参在内存中拥有自己的地址。当函数结束时形参的生命周期终止,函数内部的操作不会影响到实参的值。经典的值交换函数代码如下:

void swap1(int a, int b)
{
  int temp;
  temp = a;
  a = b;
  b = temp;
}

当以下语句调用该函数之后,i和j的值不变,互换失败,因为在函数内p和q互换了,但并不影响i和j。

swap1(i, j);

2.指针形参

和普通形参一样,指针形参是指针实参的复制,在函数中的操作也仅限于这个副本,对指针形参本身的改变不会影响实际的指针,但可以通过指针形参修改指针所指向对象的值。依然用值交换函数为例:

void swap2(int *a, int *b)
{
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
}

当以下语句调用该函数之后,i和j的值互换成功,因为通过指针p和q互换了它们所指地址存放的值,而i和p指向同一地址,j和q指向同一地址。

swap2(&i, &j);

3.引用形参

和所有引用一样,引用形参直接关联到所绑定到的对象,而并非是对象的副本,因此在函数中对形参的操作实际上也在对实参操作。引用形参的值交换函数如下:

void swap3(int &a, int &b)
{
  int temp;
  temp = a;
  a = b;
  b = temp;
}

当以下语句调用该函数之后,i和j的值互换成功,因为p和q只是i和j的引用,交换p和q时实际是在交换i和j的值。

swap1(i, j);

4.const形参

const限定符的使用使得形参在函数内部只能被调用而不能被改变,由于实参仍然是一副本的形式传递,因此传递给const形参的既可以是const对象也可以是非const对象。

在编程写函数时,如果使用引用形参的唯一目的是避免复制实参,则应将形参定义为const引用。这么做可以使得调用函数更加灵活。在此举个例子,函数func( )并没有使用const形参:

int func(int &val)
{
  return ++val;
}

那么如下的调用都是错误的,因为非const引用形参只能与完全同类的非const形参对象关联,而将func的形参改为const引用就解决了这些问题。

void main( )
{
  const int v1 = 42;
  v2 = func(v1);        //错误:v2是const的
  v2 = func(0);         //错误:0不是左值
  v2 = func(v1 + 2);    //错误:v1 + 2不是左值
}

5.数组形参

由于数组不能复制,因此处理数组的函数通常通过操纵指向数组中的元素的指针来处理数组,如以下三种方式:

void showArray(int*){}
void showArray(int[]){}
void showArray(int[10]){}

当需要严格指定数组大小时,因传递数组的引用,这时传递的不是指向数组元的指针,而是通过引用访问数组本身:

void showArray(int (&arr)[10]){}

6.函数返回值

只要不是void类型的函数都有返回值,普通类型诸如int、以及标准库类型如string作为返回值的类型就不再详细讨论了,这里说下返回的是引用的情况。

当形参是引用时,可以返回形参的引用:

const string &shorterString(const string &s1, const string &s2)
{
    return s1,size() < s2.size() ? s1 : s2;
}

此函数返回两个string类型形参中较短的那个字符串的引用。

值得注意的是,引用返回的是左值,就像下面的例子里,str所绑定的对象s本就是左值,现在不过将左值的引用返回而已,将所返回的这个引用放在等号左边,就相当于将s放在等号左边。

char &get_val(string &str, string::size_typr ix)
{
  return str[ix];
}
int main()
{
  string s("a value");
  get_val(s, 0) = ‘A‘;    //正确
  return 0;
}

最后注意一点,千万不要返回函数中局部对象的引用以及指向局部对象的指针。

C++笔记(3):函数的参数和返回值,布布扣,bubuko.com

时间: 2024-10-08 11:13:24

C++笔记(3):函数的参数和返回值的相关文章

javascript学习笔记(二):定义函数、调用函数、参数、返回值、局部和全局变量

定义函数.调用函数.参数.返回值 关键字function定义函数,格式如下: function 函数名(){ 函数体 } 调用函数.参数.返回值的规则和c语言规则类似. 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta chaset="UTF-8"> 5 <title></title> 6 </head> 7 <body

JavaScript-4.3函数的参数和返回值,参数数目不确定的函数调用---ShinePans

<html> <head> <meta http-equiv="content-type" vontent="text/html;charset=GB2312"/> <title> 4.3 参数数目不明确的函数调用 </title> <!--脚本部分--> <script type="text/javascript"> function a(){ var str=

c&amp;c++函数的参数和返回值的传递终结版

c++函数的参数和返回值的传递方式有三种:值传递.指针传递和引用传递. 在这之前先看几个例子: 一, int a=10; int b=a; b+=10; 此时b是a的一个拷贝,改变b的值,a并不会受到影响,所以此时 a=10; b=20;二, int a=10; int &b=a; b+=10; 此时b是a的引用,对于b的任何操作都相当于对a进项操作,对于b的任何操作也都相当于对a的操作,a就是b,b就是a,所以此时a,b的值都为20.三, int a=10; int *b=&a; *b+

创建数组,用函数分别实现初始化、清空和逆置。自己设计函数的参数,返回值

创建一个数组, 实现函数init()初始化数组. 实现empty()清空数组. 实现reverse()函数完成数组元素的逆置. 要求:自己设计函数的参数,返回值.*/ #include<stdio.h> #include<cstdlib> void init(int* arr, int length)//没有为arr开辟空间  可以不初始化. { int i = 0; for (i = 0; i<length; i++) { arr[i] = i;// scanf_s(&qu

Python——变量的引用和函数的参数和返回值的传递方式

变量的引用 在python中,所有的变量都是指向地址,变量本身不保存数据,而是保存数据在内存中的地址.我们用下面的程序来理解: 1 a = 10 2 print(id(a)) 3 a = 11 4 print(id(a)) (利用id( )方法查看数据的地址) 输出结果为: 可以发现:修改变量的值,变量保存的地址随之改变. python中: 变量和数据是分开存储的 变量 中保存着数据在内存中的地址 我们把变量中记录数据的地址的行为,叫做 引用. 通俗的来说,在 Python 中,变量的名字类似于

python 复习 4-1 函数、参数、返回值、递归

函数 完成特定功能的一个语句组,这个语句组可以作为一个单位使用,并且给它组语句取一个名子,即函数名 可以通过函数名在程序不同地方多次执行,即函数调用 预定义函数(可以直接使用) 自定义函数(自编写的) 函数的定义: def 函数句([参数列表]): //定义 ``` def hello (): print(hello world) #### 函数的调用: - 函数名([参数列表]) //调用 hello() #### 函数的参数: 形式参数和实际参数 - 在定义函数时,函数名后面的括号中的变量名

第10天:apply和call、bind、函数作为参数、返回值使用、闭包、递归的样例

apply和call apply和call都可以改变this的指向 函数的调用,改变this的指向 函数名字.apply(对象,[参数1,参数2,.....]) 方法名字.apply(对象,[参数1,参数2,.....]) 方法名字.call(对象,参数1,参数2,.....) 方法名字.call(对象,参数1,参数2,.....) 不同的地方:参数传递是方式不一样 只要是想使用别的对象的方法,并且希望这个方法是当前对象的,那么久可以使用apply或者call的方法改变this的指向 apply

JS中函数的本质,定义、调用,以及函数的参数和返回值

要用面向对象的方式去编程,而不要用面向过程的方式去编程 对象是各种类型的数据的集合,可以是数字.字符串.数组.函数.对象…… 对象中的内容以键值对方式进行存储 对象要赋值给一个变量 var cat={ "name":"喵1", "age":4, "family":["喵爸","喵妈"], "speak":function(){ console.log("喵喵

main函数的参数和返回值

echo $? 检测执行是否成功 0为成功 因为main函数中最后是return 0:return 0不能乱写 因为操作系统在判断程序是否执行成功时是检验返回值是否等于0 &&连接符可以连接两条指令,第一条若执行成功则执行第二条