跟着【c++Primer Plus 】第六版 学编程----第七章函数——C ++的编程模块


本章主要介绍了函数如何工作,然后介绍如何使用函数来处理数组、字符串和函数,最后介绍递归和函数指针

7.1复习函数的基本知识

使用 C++ 函数的步骤

提供函数定义;
提供函数原型;
调用函数;

定义函数

//没有返回值的函数被称为 void 函数
void functionName(parameterList)
{
statements;
return;
}
//parameterList指定传递函数的参数类型和数量

//有返回值的函数将生成一个值,并将它返回调用的函数
typeName functionName(parameterList)
{
statements;
return value;
}
//对有返回值的函数,必须使用返回语句,以便将值返回给调用函数。
//返回类型可以是任何类型的整数、浮点数、指针,甚至可以是结构体和对象,但不能是数组。

函数原型

原型描述了函数的编译接口,它将函数返回值类型以及参数类型和数量告诉编译器。
原型是一条语句,因此必须以分号结束;
函数原型不要求提供变量名,有类型列表就足够了。
功能:
编译器能正确处理函数返回值;
编译器检查使用的参数数目是否正确:
编译器检查使用的参数类型是否正确;
在编译阶段进行的原型化被称为静态类型检查;
静态类型检查可捕获许多在运行阶段非常难以捕获的错误;

7.2函数参数安置传递

c++ 通常按值传递参数,这意味着将数值参数传递给函数,而后者将其赋给一个新变量;
在函数中声明的变量是该函数私有的;
函数可以有多个参数,在调用函数时,只需使用逗号将这些参数分开即可。

7.3函数和数组

函数如何使用指针来处理数组:

数组可以视为指针
数组声明使用数组名来标记存储位置;
对数组名使用 sizeof() 将得到整个数组的长度;
将地址运算符&用于数组名时,将返回整个数组的地址;

将数组作为参数意味着什么
int sum_arr(int arr[], int n)

并没有将数组类容传递给函数而是将数组的地址、包含的元素种类以及元素数目提交给函数。
传递常规变量时,函数将使用该变量的拷贝;但传递数组时,函数将使用和原来的数组。
将数组地址作为参数可以节省复制整个数组所需的时间和内存.
传递数组时,必须显示传递数组长度,而不能在调用的函数中计算数组长度。

更多数组函数示例

填充数组

由于接受数组名参数的函数访问的是原始数组,而不是其副本因此可以通过调用该函数将值赋给数组元素

显示数组及用 const 保护数组

只需数组名和元素数目传递给函数,
然后函数使用函数来显示函数
使用 const 保护数组,避免调用函数时修改数组值

使用数组区间的函数

指定元素区间:
通过两个传递两个指针来完成,
一个指针标识数组的开头,另一个标识数组的尾部。

指针和 const

这样可以避免由于无意间修改数据而导致编程错误。
使用 const 使得函数能够处理 const 和非 const 实参,否则将只能接受非const 数据。

int gorp = 16;
int chios = 12;
const int* p_snack = &gorp;
*p_snack = &20;//error 禁止修改p_snak指向的值
p_snack = &chios; //true p_snack可以指向另一个变量
int gorp = 16;
int chios = 12;
int* const p_snack = &gorp;
*p_snack = &20;//true 可以修改p_snak指向的值
p_snack = &chios; //error禁止改变p_snack指向的变量
int gorp = 16;
int chios = 12;
const int* const p_snack = &gorp;
*p_snack = &20;//error 禁止修改p_snak指向的值
p_snack = &chios; //error禁止改变p_snack指向的变量

7.4函数和二维数组

数组名被视为指针,相应的形参也是一个指针

7.5函数和 C-风格字符串

C-风格字符串由一系列字符串组成,以空格字符结尾。
将字符串作为参数 时意味着传递的是地址,可以使用 const 来禁止对字符串进行修改。
将字符串作为参数来传递,实际传递的是字符串第一个字符串的地址.

7.6函数和结构

结构名只是结构的名称,要获得结构的地址,必须使用地址运算符&;
函数使用原始结构副本,函数可以返回结构;
当结构较小时,按值传递最为合理;
传递结构的地址而不是整个结构可以节省时间和空间;

7.7函数和 string 对象

string 对象与结构相似。
如果需要多个字符串,可以声明一个 string 对象数组,而不是二位 char 数组。

7.8函数 和 array 对象

类对象基于结构,因此结构编程方面的有些考虑因素也适用于类。
可以按值将对象传递给函数,也可以传递指向对象的指针。

7.9递归

包含一个递归调用的递归

通常把递归调用放到 if 语句中

void recurs(arguementlist)
{
statements1
if(test)
recurs(arguments)
statements2
}//test 终将为 false,调用链将断开

包含多个递归调用的递归

在需要将一项工作分成两项较小的、类似的工作时,
使用递归非常有用

7.10函数指针

函数指针的基础知识

与数据相似,函数也有地址;
获取函数的地址:只需要使用函数名就行(后面不跟参数);
要将函数作为参数传递,必须传递函数名;

process(think);//process()函数调用使得process()函数可以在内部调用think()函数
thought(think());//thought()调用首先调用think()函数然后将think()的返回值传递给thought()函数

声明函数指针:
声明指向某种数据类型的指针时,
必须指定指针指向的类型,函数亦如此。
double (*pf)(int);

用指针调用函数:将它看作函数名即可

深入探讨函数指针

const double* f1(const double ar[], int n);
const double* f2(const double [], int n);
const double* f3(const double *, int n);
//三者看似不同,实则相同;const double ar[]可以简化为const double [],
//而const double []可以简化为const double *;

使用C++ 11的自动类型推断功能时,可以直接使用auto声明指针。

const double* (*pa[3])(const double *, int n);
//pa表示一个包含三个函数的指针数组。
&pa和pa的值相同,但类型不同

在这里插入图片描述

思维导图可以找我那 x-mind 源文件呢;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳请了个假

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值