浅谈C++函数

一、函数的概念

函数是C++程序的基本模块,通常一个C++程序由一个或多个函数组成。函数可以完成用户指定的任务,一般分为库函数和用户自定义的函数。函数由函数头和函数体组成,函数头中包含了函数的函数名、返回类型和参数列表,函数体则描述了函数执行任务的过程和结果。

二、调用函数的两个前提

首先需要函数声明,编译器需要根据函数声明来判断调用函数的使用是否正确。其次需要函数定义,编译器判断调用函数的使用无误之后,会停止当前函数的运行,进入被调函数的定义执行被调函数,然后返回原函数继续往下执行。
在这里插入图片描述

三、函数传参的三种形式

在C++中函数有三种传参方式:值传递、指针传递和引用传递。

1. 值传递
值传递时,形参的改变不会影响实参。因为形参和实参是两个变量,它们都有自己的内存空间,只是存储的值相同。

2. 指针传递
指针传递时,形参的改变可以影响实参。虽然形参和实参依旧是两个变量,但是形参存储了实参的地址,指向实参,可以通过解引用运算符(*)对实参的值进行修改。如果不想让实参被改变,可以添加const限定符。

3. 引用传递
引用传递时,形参的改变一定影响实参。因为实参和形参是一个变量,形参只是实参的别名。如果不想让形参改变,可以添加const限定符。

下面通过一个交换两个数的代码,来对上面三种形式做出直观的说明:

// 函数声明
void Swap1(int a, int b);  // 值传递
void Swap2(int* a, int* b);  // 指针传递
void Swap3(int& a, int& b);  // 引用传递

int main()
{
	int a = 10, b = 5;
	// 交换a和b
	Swap1(a, b);
	cout << "值传递: " << "a = " << a << ", b = " << b << endl;
	Swap2(&a, &b);
	cout << "指针传递: " << "a = " << a << ", b = " << b << endl;
	Swap3(a, b);
	cout << "引用传递: " << "a = " << a << ", b = " << b << endl;


	return 0;
}

// 函数定义
void Swap1(int a, int b)  // 值传递
{
	int temp = b;
	b = a;
	a = temp;
}
void Swap2(int* a, int* b)  // 指针传递
{
	int temp = *b;
	*b = *a;
	*a = temp;
}
void Swap3(int& a, int& b)  // 引用传递
{
	int temp = b;
	b = a;
	a = temp;
}

运行结果如下:
在这里插入图片描述
可以看到值传递并没有交换a和b,因为它只是交换了a和b的副本。指针传递通过解引用操作找到了原函数的a和b然后进行交换。引用传递使用的就是原函数的a和b本身。这里点到为止,只需要知道函数有三种传参方法和如何使用这三种方法就可以了。

四、函数返回类型

作者认为函数返回类型可以分为四种:无返回(void)、返回值、返回指针和返回引用。
无返回类型就是调用函数结束没有返回值给原函数。而返回值是返回被调函数中变量的临时拷贝,使用完后丢弃。返回指针和引用可以在原函数中使用被调函数的变量。注意: 不能返回被调函数中定义的局部变量的指针或引用,函数调用结束后,该变量被销毁,其内存空间被操作系统回收。如果通过返回的指针或引用去访问这块空间,会造成非法访问。

相关推荐

  1. C++友元函数

    2024-05-26 00:56:47       17 阅读
  2. 欧拉函数

    2024-05-26 00:56:47       27 阅读
  3. C4模型

    2024-05-26 00:56:47       32 阅读
  4. C语言inline关键字

    2024-05-26 00:56:47       36 阅读
  5. C++容器——unordered_set

    2024-05-26 00:56:47       21 阅读
  6. C++容器——unordered_map

    2024-05-26 00:56:47       23 阅读
  7. C++进阶——隐式转化

    2024-05-26 00:56:47       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-26 00:56:47       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-26 00:56:47       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-26 00:56:47       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-26 00:56:47       18 阅读

热门阅读

  1. hetaozy-2D/2D数列位置问题

    2024-05-26 00:56:47       8 阅读
  2. 从零学算法1542

    2024-05-26 00:56:47       13 阅读
  3. 在Juniper SRX系列防火墙上配置DNS

    2024-05-26 00:56:47       9 阅读
  4. k8s配置pods滚动发布

    2024-05-26 00:56:47       10 阅读
  5. Git下载慢

    2024-05-26 00:56:47       12 阅读
  6. 使用FFmpeg进行多媒体处理的完整指南

    2024-05-26 00:56:47       14 阅读
  7. MySQL技术点合集

    2024-05-26 00:56:47       11 阅读
  8. PaddleClas 指定gpu

    2024-05-26 00:56:47       9 阅读
  9. PHP开发安全:专家级代码审计策略与方法

    2024-05-26 00:56:47       11 阅读
  10. Flutter 中的 ExpandIcon 小部件:全面指南

    2024-05-26 00:56:47       11 阅读
  11. Python项目开发实战:五子棋游戏(案例教程)

    2024-05-26 00:56:47       11 阅读
  12. QGraphicsView中鼠标位置图像缩放时不变

    2024-05-26 00:56:47       11 阅读
  13. 【Spark】加大hive表在HDFS存的每个文件的大小

    2024-05-26 00:56:47       9 阅读