《C++ Primer Plus》《7、函数——C++的编程模块》

文章目录

  • 前言
  • 1复习函数的基本知识
    • 1.1定义函数
    • 1.2函数原型和调用函数
  • 2函数的参数和按值传递
    • 2.1多个参数
    • 2.2另一个接受两个参数的函数
  • 3函数和数组
    • 3.1函数如何用指针来处理数组
    • 3.2将数组作为参数意味着什么
    • 3.3更多的数组函数示例
    • 3.4使用数组区间的函数
    • 3.5指针和const
  • 4函数和二维数组
  • 5函数和C风格字符串
    • 5.1将C风格字符串作为参数的函数
    • 5.2返回C风格字符串的函数
  • 6函数和结构
    • 6.1传递和返回结构
    • 6.2另一个处理结构的函数示例
    • 6.3传递结构的地址
  • 7函数和string对象
  • 8函数与array对象
  • 9递归
    • 9.1包含一个递归调用的递归
    • 9.2包含多个递归调用的递归
  • 10函数指针
    • 10.1函数指针的基础知识
    • 10.2函数指针的示例
    • 10.3深入探讨函数指针
    • 10.4使用typedef进行简化
  • 11总结
  • 12 参考

前言

函数无论对于哪种语言来说都意义重大,之前学习的基本概念,变量的基本类型,符合类型;函数中的顺序语句,循环语句,条件语句等都最终为了函数服务。在程序开发的初期阶段,为了实现某个具体函数,开发人员都是在了解功能需求之后开始写函数,进而实现相应的功能。后期,这种类似的开发的函数写多了,便可以从整体项目着手,开始对项目的架构进行构建,所以函数是基础,得掌握函数的基本知识。

1复习函数的基本知识

要使用C++函数,必须完成以下工作:
1)提供函数定义;
2)提供函数原型;
3)调用函数
在创建自己的函数时。必须自行处理这三个方面——定义,提供原型和调用。

1.1定义函数

此处可以将函数分为两大类:有返回值的函数,没有返回值的函数。
1)没有返回值的函数:
函数原型:

void functionname(parameterList){statements(s);return;
}

2)有返回值的函数:
函数原型:

typeName functionname(parameterList){statements(s);return value;
}

在这里插入图片描述

1.2函数原型和调用函数

  • 1)为什么需要原型

原型编译了函数到编译器的接口,也就是说,它将函数返回值的类型以及参数的类型和数量告诉给编译器。可以这样理解,你是老板要各自分配工作,你起码得在工作之前,把大家的名字都知道一下。

  • 2)原型的语法

函数原型是一条语句,因此必须以分号结束,获得原型最简单的办法就是,复制函数定义的函数头然后添加分号。

  • 3)原型的功能

a.编译器正确处理函数返回值;
b.编译器检查使用的参数数目是否正确;
c.编译器检查使用的参数类型是否正确;如果不正确,则转化为正确的类型;

2函数的参数和按值传递

C++按数值传递参数,用于接受传递值的变量被称为形参,传递给函数的数值被称为实参。
在这里插入图片描述

2.1多个参数

函数可以有多个参数,只需要使用逗号将这些参数分开,同时要明确声明每个参数的类型。书中给出了示例程序。

2.2另一个接受两个参数的函数

书中用另一个公式来计算可能性,程序上稍显复杂,原理一致。

3函数和数组

首先书中给出了示例代码,演示如同使用数组名一样使用指针。

3.1函数如何用指针来处理数组

将数组名视为指针,对数组名使用sizeof()将得到整个数组的长度。

3.2将数组作为参数意味着什么

传递的是数组的位置(地址),包含的元素种类(类型),以及元素数目(n变量)。书中也给出了示例代码。
在这里插入图片描述

3.3更多的数组函数示例

项目中会对数组进行操作,一般情况下初始化,赋值操作较为常见。如果说对数组的操作较为频繁,可以对初始化,赋值操作单独拎出来写一个功能函数。

3.4使用数组区间的函数

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

3.5指针和const

可以用两种不同的方式将const关键字用于指针:第一种方法是让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的数值;第二种方法是将指针本身声明为常量,这样可以防止改变指针指向的位置。

4函数和二维数组

以整型数组为例,数组的成员是一个整型数字;但是对于二位数组,数组中的一个元素,则是一维数组。以ar2[r][c]这个二维数组为例,

ar2[c][r] = *(*(ar2+r)+c)  //表示相同的元素
ar2      // 指针指向第一行的4个元素
ar2+r	 //指向二维数组的第r行
*(ar2+r)	 //数组的第r行

5函数和C风格字符串

5.1将C风格字符串作为参数的函数

将字符串作为参数来传递,但实际传递的是字符串第一个字符的地址,这意味着字符串函数原型应该将其表示为字符串的形参声明为char*类型。

5.2返回C风格字符串的函数

书中编写了一个返回字符串的函数;函数无法返回一个字符串,但是可以返回字符串的地址,这样的效率更高。

6函数和结构

6.1传递和返回结构

当结构比较小时,按值传递结构比较合理,书中给出了相应的示例。

6.2另一个处理结构的函数示例

书中给出的示例用了两个结构。

6.3传递结构的地址

要传递结构的地址而不是整个结构,函数在运行时便会节省时间和空间,函数传入的参数都是指向结构体的指针。

7函数和string对象

书中给出了一个小型示例,声明了一个string对象数组,并将该数组传递给一个函数以显示其内容。

8函数与array对象

书中给出了一个示例,处理array对象;就是用array对象来存储一年四个季度的开支,然后计算中总和,打印下来。

9递归

递归简单来说就是函数自己调用自己。

9.1包含一个递归调用的递归

void recurs(argumentlist){statement1if(test)recurs(arguments)statement2
}

当调用链为false时,调用链将断开。注意当test的返回值一直为true时,每个recurs()都会执行statement1,然后再调用recurs(),而不会执行statement2。只有当test返回值为false时,才会逆序执行statement2。书中给出了示例程序。
每次递归调用都会创建属于自己的一套变量。

9.2包含多个递归调用的递归

在需要将一份工作不断分为两项较小的,类似的工作时,递归非常有用,书中给出了示例代码。

10函数指针

10.1函数指针的基础知识

使用函数指针需要完成3个工作
(1)获取函数的地址
(2)声明一个函数指针
(3)使用函数指针来调用函数

10.2函数指针的示例

书中给出了示例代码。

10.3深入探讨函数指针

书中给出了示例代码。
注意pa与&pa的区别,pa都是数组第一个元素的地址,即&pa[0],它是单个指针的地址;&pa是整个数组的地址。pa+1表示的是数组中下一个元素的地址,&pa+1表示横跨整个内存块后的地址。

10.4使用typedef进行简化

Typedef是对变量类型起了个别名。

11总结

书上的总结是对7.1-7.10知识点的概括,C++在函数方面进行了相应的扩展,这才是需要重点进行掌握的。

12 参考

12.1 《C++ Primer Plus》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/485683.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跳格子3 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 小明和朋友们一起玩跳格子游戏,每个格子上有特定的分数,score[] [1 -1 -6 7 -17 7], 从起点score[0]开始,每次最…

应急响应实战笔记03权限维持篇(2)

关键词:Windows系统后门、权限维持 在获取服务器权限后,通常会用一些后门技术来维持服务器权限,服务器一旦被植入后门,攻击者便如入无人之境。本文将对常见的window服务端自启动后门技术进行解析,知己知彼方能杜绝后门…

【计算机网络】数据链路层|封装成帧|透明传输|差错检测|PPP协议|CSMA/CD协议

目录 一、思维导图 ​ 二、数据链路层功能概述 1.数据链路层概述 2.数据链路层功能概述——封装成帧 3.数据链路层功能概述——透明传输 4.数据链路层功能概述——差错检测 三、数据链路层重要协议 1.数据链路层重要协议:PPP协议 2.数据链路层重要协议&#x…

Spring 类型转换、数值绑定与验证(二)—PropertyEditor与Conversion

Spring 中,属性类型转换是在将数值绑定到目标对象时完成的。例如在创建ApplicationContext 容器时,将XML配置的bean 转换成Java类型对象,主要是借助了PropertyEditor类,而在Spring MVC 的Controller的请求参数转化为特定类型时&am…

论文阅读《Sylph: A Hypernetwork Framework for Incremental Few-shot Object Detection》

论文地址:https://arxiv.org/abs/2203.13903 代码地址:https://github.com/facebookresearch/sylph-few-shot-detection 目录 1、存在的问题2、算法简介3、算法细节3.1、基础检测器3.2、小样本超网络3.2.1、支持集特征提取3.2.2、代码预测3.2.3、代码聚合…

c++服务器开源项目Tinywebserver运行

c服务器开源项目Tinywebserver运行 一、Tinywebserver介绍二、环境搭建三、构建数据库四、编译Tinywebserver五、查看效果 Tinywebserver是github上一个十分优秀的开源项目,帮助初学者学习如何搭建一个服务器。 本文讲述如何在使用mysql跟该项目进行连接并将项目运行…

中科大计网学习记录笔记(十三):UDP 套接字编程 | 传输层概述和传输层的服务

前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信…

igolang学习2,golang开发配置国内镜像

go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct

轻松掌握opencv的8种图像变换

文章目录 opencv的8种图像变换1. 图像放大、缩小2. 图像平移3. 图像旋转4. 图像仿射变换5. 图像裁剪6. 图像的位运算(AND, OR, XOR)7. 图像的分离和融合8. 图像的颜色空间 opencv的8种图像变换 1. 图像放大、缩小 我们先看下原图 import cv2 import ma…

Stable Diffusion 模型分享:A-Zovya RPG Artist Tools(RPG 大师工具箱)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 A-Zovya RPG Artist Tools 模型是一个针对 RPG 训练的一个模型,可以生成一些 R…

用友U8库存展望数据显示错误

1、库存展望显示有订单在途。 2、双击查看明细,显示某个采购订单显示有预计入库量。 3、查询该采购订单,发现已入库完成未退货,确定为数据异常。 修改采购订单表体的iReceivedQTY(累计到货数量)字段后,恢复正常。 UPDATE dbo.PO_…

这6款实用的AI写作软件你值得拥有

在当今信息爆炸的时代,人们对于高效、便捷的写作工具需求越来越迫切。AI写作软件应运而生,为广大写作者提供了更加智能、高效的写作方式。在国内,有许多优秀的AI写作软件,下面就为大家介绍6款实用的AI写作软件,让你的写…