当前位置: 首页 > news >正文

【和春笋一起学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.xdnf.cn/news/210907.html

相关文章:

  • 从拒绝采样到强化学习,大语言模型推理极简新路径!
  • JDK 8 函数式接口全集
  • Electron读取本地文件
  • 客户案例分享|运营商数智化经典案例 — XX运营商
  • TRAE历史版本下载参考
  • JavaScript性能优化实战:从基础到高级的全面指南
  • 精益数据分析(32/126):电商指标优化与搜索策略解析
  • 工业声纹采集设备的市场需求趋势简析
  • 好未来golang后端开发
  • iOS - 音频: Core Audio - 播放
  • 【阿里云大模型高级工程师ACP习题集】2.7 通过微调增强模型能力 (上篇)(⭐️⭐️⭐️ 重点章节!!!)
  • 【Luogu】动态规划七
  • 3D Gaussian Splatting部分原理介绍和CUDA代码解读
  • 实验六 文件操作实验
  • 计算机视觉与深度学习 | 双目立体匹配算法理论+Opencv实践+matlab实践
  • 20250429-李彦宏口中的MCP:AI时代的“万能接口“
  • hover加图层图放大
  • 多块盘创建RAID5以及后增加空间
  • shell(4)
  • UBUS 通信接口的使用——添加一个object对象(ubus call)
  • 开放平台架构方案- GraphQL 详细解释
  • 2025年- H13-Lc120-189.轮转数组(普通数组)---java版
  • Cliosoft安装
  • 【AI学习】李宏毅新课《DeepSeek-R1 这类大语言模型是如何进行「深度思考」(Reasoning)的?》的部分纪要
  • 大屏 UI 设计:解锁视觉盛宴的奥秘
  • Microsoft .NET Framework 3.5 离线安装包 下载
  • python celery框架结合django的使用
  • 爬虫学习笔记(五)---数据解析之re
  • 【最新 MCP 战神手册 09】利用资源和提示增强上下文
  • Linux批量管理:Ansible自动化运维指南