【和春笋一起学C++】函数——C++的编程模块

目录

1. 原型句法

2. 函数分类

3. 函数参数之按值传递

4. 数组作为函数参数


在C++中,要使用函数,必须要有这三个方面:

  1. 函数原型,函数原型描述了函数到编译器的接口,函数原型一般放在include文件中。函数原型告诉编译器需要提供什么样的形参,如果程序没有提供这样的形参,原型将让编译器能够捕获这种错误。
  2. 函数定义。
  3. 调用函数,函数调用是一个语句。

可能很多初学者会问,有了函数定义为什么需要函数原型?

C++允许一个程序放在多个文件中单独编译,然后再将它们组合起来。在这种情况下,编译器在编译main()函数时,可能无法访问函数定义的代码。

总的来说,函数原型有3个作用:

  1. 使编译器能正确处理函数返回值;
  2. 使编译器能检查使用的参数数目是否正确;
  3. 使编译器能检查使用的参数类型是否正确;

避免使用函数原型的唯一方法是在main()函数之前定义它。但C++的编程风格是将main()函数放在最前面,因为它通常提供了程序的整体风格。

1. 原型句法

  • 原型句法是一条语句,因此必须以分号结束;
  • 获得原型最简单的方法是复制函数定义中的函数头,并添加分号;
  • 函数原型不要求提供变量名,有类型列表即可。参数列表可以包括变量名,也可以不包括变量名,原型中的变量名相当于占位符,不必与函数定义中的变量名相同。在函数定义中形参变量名一般用_a, _b, _c形式的命名方式。

C++占位符相关知识:

(1)auto:在C++11及以后,auto可以为类型占位符,由编译器推导类型。如:

auto x=2; //x被推导为int类型

(2)格式化输出时,占位符用于指定变量插入的位置和格式,如:

printf("Number: %d, string: %s", 2, "hello");

2. 函数分类

函数分为两类:

  • 没有返回值的函数,称为void函数,通用格式为:
void functionName(paralist)
{statements;return;//optional
}
  • 有返回值的函数,通用格式为:
typeName functionName(paralist)
{statements;return value;//optional
}

对于有返回值的函数,必须使用返回语句,以便将返回值传递给调用函数。C++对于返回值的类型有一定的限制,不能是数组,但可以是其他任何类型——整型,浮点型,指针,甚至可以是结构体和对象。(虽然C++不能直接返回数组,但可以将数组作为结构体或对象的组成部分来返回)

返回语句也可以是一个表达式。

3. 函数参数之按值传递

按值传递的函数参数,形参使用的是实参数据的拷贝,在函数中改变形参的值不会改变实参的值。

在函数中声明的变量(包括形参)都是该函数私有的。在函数被调用时,计算机将为这些变量分配内存,函数调用结束后,这些变量所占用的内存被释放,这样的变量被称为局部变量,因为它们被限制在函数中,也被称为自动变量,因为它们的内存在程序执行过程中自动分配和自动释放的,不需要人为干预。

4. 数组作为函数参数

将数据作为函数参数时,需要将数组的大小一并传递,因为数组名只代表了数组的首地址,如果不传递数组长度,函数就无法数组的长度。以下实例可以更好的了解数组作为函数参数时为何一定要把长度也传递给函数。

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int sum_arr(int arr[], int n);
int main()
{int cookies[6] = { 1,2,4,6,8,10 };cout << "size of cookers: " << sizeof(cookies) << endl;cout << "size of cookers[0]: " << sizeof(cookies[0]) << endl;cout << "size of &cookers[0]: " << sizeof(&cookies[0]) << endl;int sum = sum_arr(cookies, 6);cout << "sum: " << sum << endl;return 0;
}int sum_arr(int arr[], int n)
{int total = 0;cout << "size of arr: " << sizeof(arr) << endl;for (int i = 0; i < n; i++){total = total + arr[i];}return total;
}

以下为输出结果,cookies=24表示数组所占的字节数为24,cookies[0]=4表示第一个元素所占的字节数为4,因为数组总共有6个元素,所以没有问题。 &cookies[0]表示的是数组的首地址,大小为8个字节,传递给函数时使用的是数组名,在函数中输出arr的大小也是8个字节,说明数组名作为函数参数时只传递数组的地址(首地址),不会传递整个数组所有的元素值。

 将实例代码中的函数调用换成如下参数:

int sum = sum_arr(cookies+2, 3);

表示传递的是数组第3个元素的地址,并且设置了数组的长度为3,即只求第3,4,5三个元素的和,所以结果应该是18,程序运行结果如下:

 

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

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

相关文章

深挖Java基础之:认识Java(创立空间/先导:Java认识)

今天我要介绍的是在Java中对Java的一些基本语法的认识与他们的运用&#xff0c;以及拟举例子说明和运用场景&#xff0c;优势和劣势&#xff0c; 注&#xff1a;本篇文章是对Java的一些基本的&#xff0c;简单的代码块的一些内容&#xff0c;后续会讲解在Java中的变量类型&…

Python+Selenium+Pytest+Allure PO模式UI自动化框架

一、框架结构 allure-report&#xff1a;测试报告base&#xff1a;定位元素封装data&#xff1a;数据log&#xff1a;日志文件page&#xff1a;页面封装文件夹report&#xff1a;缓存报告testcases&#xff1a;测试用例层utils&#xff1a;工具类run.py&#xff1a;执行文件 二…

博物馆除湿控湿保卫战:M-5J1R 电解除湿科技如何重塑文物守护的未来

在卢浮宫幽深的长廊里&#xff0c;达芬奇的《蒙娜丽莎》正经历着一场看不见的战争——不是来自时间的侵蚀&#xff0c;而是空气中无形的水分子。每一件文物都在与湿度进行着无声的抗争&#xff0c;这场抗争关乎人类文明的延续。湿度&#xff0c;这个看不见的文物杀手&#xff0…

【嘉立创EDA】如何找到曲线和直线的交点,或找到弧线和直线的交点

文章路标👉 :one: 文章解决问题:two: 主题内容:three: 参考方法be end..1️⃣ 文章解决问题 操作环境:嘉立创EDA专业版 V2.2.38 本文使用嘉立创EDA,描述如何快速找到曲线和直线交点的方法,这里的曲线包括了弧线等。本文将此过程记录,以供有需要的读者参考。 2️⃣ 主题…

大语言模型能否替代心理治疗师的深度拓展研究:fou

大语言模型能否替代心理治疗师的深度拓展研究 在科技初创企业和研究领域,大型语言模型(LLMs)用于替代心理健康服务提供者的应用备受关注。但研究人员通过对主要医疗机构治疗指南的梳理回顾,并对当前 LLMs(如 gpt-4o)进行实验评估后发现,LLMs 存在对心理疾病患者表达污名…

【linux】Chrony服务器

简介 1.1 时间的重要性 由于 IT 系统中&#xff0c;准确的计时非常重要&#xff0c;有很多种原因需要准确计时&#xff1a; 在网络传输中&#xff0c;数据包括和日志需要准确的时间戳 各种应用程序中&#xff0c;如订单信息&#xff0c;交易信息等 都需要准确的时间戳 1.2 时区…

mysql查看哪些表的自增id已超过某个值

场景 想看哪些表数据比较大&#xff0c;如果用count 比较慢&#xff0c;同时表设计如果是自增&#xff0c;有没有办法一次查出自增id已超过某值的所有表呢。 方法 SELECT AUTO_INCREMENT,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA 库名 AND AUTO_INCRE…

SiamMask原理详解:从SiamFC到SiamRPN++,再到多任务分支设计

SiamMask原理详解&#xff1a;从SiamFC到SiamRPN&#xff0c;再到多任务分支设计 一、引言二、SiamFC&#xff1a;目标跟踪的奠基者1. SiamFC的结构2. SiamFC的局限性 三、SiamRPN&#xff1a;引入Anchor机制的改进1. SiamRPN的创新2. SiamRPN的进一步优化 四、SiamMask&#x…

SpringBoot终极形态:AI生成带OAuth2鉴权的微服务模块(节省20人日)

在数字化转型的浪潮中,开发效率和质量是企业竞争力的关键要素。飞算 JavaAI 作为一款创新的 AI 工具,能在 Spring Boot 开发中,自动生成完整微服务模块,极大提升开发效率。下面,我们就详细介绍如何借助飞算 JavaAI,实现 Spring Boot 微服务模块的自动化生成。 飞算 JavaAI 简介…

Spring缓存注解深度实战:3大核心注解解锁高并发系统性能优化‌

引言&#xff1a;缓存——高并发系统的“性能加速器”‌ 在互联网应用中&#xff0c;数据库查询往往是性能瓶颈的核心。当每秒数千次的请求直接冲击数据库时&#xff0c;系统响应速度会急剧下降&#xff0c;甚至引发宕机风险。‌缓存技术‌应运而生&#xff0c;成为解决这一痛…

CSS元素动画篇:基于当前位置的变换动画(二)

基于当前位置的变换动画&#xff08;二&#xff09; 前言旋转效果类元素动画摇摆动画效果效果预览代码实现 摇晃动画效果效果预览代码实现 螺旋旋转效果预览代码实现 结语 前言 CSS元素动画一般分为两种&#xff1a;一种是元素基于当前位置的变换动画&#xff0c;通过不明显的…

Qt/C++开发监控GB28181系统/设备注册/设备注销/密码认证/心跳保活/校时

一、前言 根据gb28181协议文档&#xff0c;第一步就是需要实现设备的注册&#xff0c;和onvif不同&#xff0c;gb是反过来的&#xff0c;设备端主动连接服务端&#xff0c;而onvif是服务端主动发出搜索&#xff0c;设备被动应答&#xff0c;包括后续的交互几乎都是被动应答&am…

MATLAB 中的图形绘制

一、线图 plot 函数用来创建x和y值的简单线图。 x 0 : 0.05 : 30; %从0到30&#xff0c;每隔0.05取一次值 y sin(x); plot(x,y,LineWidth,2) %若&#xff08;x&#xff0c;y&#xff0c;LineWidth&#xff0c;2&#xff09;可变粗 xlabel("横轴标题") ylab…

go语言八股文(五)

1.go的局部变量是分配在栈上还是在堆上 在Go语言中&#xff0c;局部变量的内存分配&#xff08;栈或堆&#xff09;由编译器基于逃逸分析&#xff08;escape analysis&#xff09;来决定。以下是总结和具体示例&#xff1a; 栈上分配 当局部变量的生命周期严格限定在函数作用…

Gradients of Matrix-Matrix Multiplication in Deep Learning

Gradients of Matrix-Matrix Multiplication in Deep Learning 1. Matrix multiplication2. Derivation of the gradients2.1. Dimensions of the gradients2.2. The chain rule2.3. Derivation of the gradient ∂ L ∂ A \frac{ {\partial L} }{ {\partial \boldsymbol {\bo…

Spring Boot 框架简介

✨ Spring Boot 框架简介 1️⃣ &#x1f680; 快速构建 Spring Boot 能够快速构建可直接运行的、企业级 Spring 应用。 2️⃣ ⚙️ “约定优于配置” 该框架采用"约定优于配置"理念&#xff0c;默认集成 Spring 平台与主流第三方库&#xff0c;开发者仅需简单配置…

【Robocorp实战指南】Python驱动的开源RPA框架

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1&#xff1a;网页数据抓取案例2&#xff1a;Excel报表生成 运行结果验证 三、性能对比测试方…

如何使用 Spring Boot 实现分页和排序:配置与实践指南

在现代 Web 应用开发中&#xff0c;分页和排序是处理大量数据时提升用户体验和系统性能的关键功能。Spring Boot 结合 Spring Data JPA 提供了简单而强大的工具&#xff0c;用于实现数据的分页查询和动态排序&#xff0c;广泛应用于 RESTful API、后台管理系统等场景。2025 年&…

使用 LLM助手进行 Python 数据可视化

在数据科学中&#xff0c;数据可视化是一项至关重要的任务&#xff0c;旨在揭示数据背后的模式和洞察&#xff0c;并向观众传达这些信息。然而&#xff0c;在编程语言&#xff08;如 Python&#xff09;中创建有洞察力的图表有时可能会耗时且复杂。本文介绍了一种借助 AI 助手&…

RASP技术是应用程序安全的“保护伞”

对于企业组织而言&#xff0c;随着新技术的不断涌现&#xff0c;企业在应用程序和数据安全方面也面临着诸多挑战。之所以如此&#xff0c;是因为常见的保护措施&#xff0c;如入侵防御系统和Web应用程序防火墙&#xff0c;有助于检测和阻止网络层的攻击&#xff0c;但它们无法看…