C++ Primer笔记 第四篇:C++基础——函数

本文详细介绍了C++中的函数基础,包括函数的概念、传参方式(值传递、引用传递、数组形参)、返回机制、函数重载以及函数指针的使用。重点讨论了引用传递的优势和数组形参的实际传递方式,以及如何通过函数指针调用函数。
摘要由CSDN通过智能技术生成


一、基础概念

  • 调用函数: 主调函数的执行被暂时中断,控制权转移给被调函数,被调函数开始执行。
  • 执行函数:
    1.(隐式地)定义并初始化(注意: 不是赋值)函数形参;实参是形参的 初始值
    2. 遇到 return 语句时结束执行,返回 return 语句中的值,并将控制权转移回主调函数。
  • 函数声明: 和变量名一样,函数名字在使用前也需要先声明。类似于变量,函数只能定义一次,但可以声明多次。建议在头文件中声明函数,在源文件中定义函数;而且定义函数的源文件应该包含声明函数的头文件,编译器负责检验函数的定义和声明是否匹配。

二、传参

1、值传递

形参不是引用类型时,进行值传递。实参的值被拷贝给形参,形参和实参是两个独立的对象。函数对形参的所有操作都不会影响实参。

2、引用传递

形参是引用类型时,它将绑定到对应的实参上。此时形参是实参的别名,函数对形参的操作都会反映在实参上。

当实参是较大的类类型对象或容器对象时,直接拷贝实参给形参比较低效,甚至有些类类型根本就不支持拷贝操作。此时函数就可以使用引用形参来访问实参。

引用传递时,函数的形参最好定义为 常量引用 。一方面,它暗示了函数不会修改实参的值;另一方面,非常量引用作为形参,会极大地限制函数所能接受的实参类型,比如 const 对象、字面值或需要类型转换的对象就不能传递给形参。

3、数组形参

数组的2个特殊性质:(1) 不允许拷贝数组;(2)使用数组时,通常会将其转换成指针。

由于数组的特殊性质,我们无法以值传递的方式使用数组参数;而且,当我们向函数传递一个数组参数时,实际上传递的是指向数组首元素的指针

因为数组是以指针的形式传递给函数的,所以函数并不知道数组的确切大小。因此,调用者应该提供一些额外的信息来让函数确定数组的大小。一般有以下3中方式:

  • 数组本身包含一个结束标记,如C风格字符串
  • 传给函数数组首元素和尾后元素的指针(使用标准库中的beginend 函数)
  • 显式传递一个表示数组大小的形参

还可以将数组形参定义为数组的引用,此时,引用形参绑定到对应的数组实参上:

void func(int (&array)[10]) {
    ...
}

这种方式下,数组的大小是确定的,只能传给函数一个维度为10的数组

三、返回

  • 返回类型是 void 的函数表示函数没有返回值,直接使用 return; 语句即可。
  • 返回一个值的方式和初始化一个变量或形参的方式完全一样: 返回的值用于初始化调用点的一个 临时量 ,该临时量就是函数调用的结果。
  • 不要返回 局部 对象的引用或指针:函数调用完成后,所占用的内存空间也随之被释放,因此,函数完成意味着函数中的 局部变量 的引用或指针将指向不再有效的内存区域。

四、函数重载

函数重载: 同一作用域内多个函数名字相同但形参列表不同

  • 重载 和 顶层const形参: 一个拥有顶层const的形参和另一个没有顶层const的形参无法区别开,比如:
    // 声明函数
    void fun(const int num);
    void fun(int num);
    // 调用函数
    fun(2);
    
    当调用函数fun时,程序无法确定调用的是哪个版本。

五、函数指针

函数指针指向函数而非对象。函数指针指向某种特定类型,函数的类型由它的返回类型和形参类型共同决定 ,与函数名无关。

bool lengthCompare(const string &, const string &);
该函数的类型是 bool(const string &, const string &)。声明一个指向该函数的指针,只需要用指针替换函数名即可:
bool (*pf)(const string &, const string &);

5.1 使用函数指针

当把函数名作为一个值使用时,该函数名自动转换成指针。

pf = lengthCompare;   //pf指向lengthCompare函数
pf = &lengthCompare;  //等价,取地址符是可选的

也可以直接使用函数指针来调用函数:

bool b1 = pf("hello", "world");    //不必先解引用
bool b2 = (*pf)("hello", "world");  //等价调用,可以先解引用指针
bool b3 = lengthCompare("hello", "world");  //和上面两个调用是等价的
5.2 形参是函数指针

无法定义函数类型的形参,但形参可以是指向函数的指针:

// 两个等价的函数声明
void func(bool pf(const string &, const string &));
void func(bool (*pf)(const string &, const string &));

// 可以把函数作为实参使用,传入函数名,自动转换成指针
func(lengthCompare);
5.3 return 函数指针

和数组类似,虽然不能返回一个函数,但是可以返回指向函数的指针。此时,必须把返回类型写成指针形式。

int (*func(int)) (int*, int);

由内向外阅读这条声明语句:func有形参列表,说明func本身是一个函数,接收一个int型的参数;func前面有*,说明func返回一个指针;这个指针的类型本身也包含一个形参列表,因此这个指针是一个函数指针,接受2个参数,返回一个int类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
1. 智慧监狱概述 智慧监狱的建设背景基于监狱信息化的发展历程,从最初的数字化监狱到信息化监狱,最终发展到智慧监狱。智慧监狱强调管理的精细化、监管的一体化、改造的科学化以及办公的无纸化。政策上,自2017年以来,司法部连续发布了多项指导性文件,推动智慧监狱的建设。 2. 内在需求与挑战 智慧监狱的内在需求包括数据应用与共享的不足、安防系统的单一功能、IT架构的复杂性、信息安全建设的薄弱以及IT运维的人工依赖。这些挑战要求监狱系统进行改革,以实现数据的深度利用和业务的智能化。 3. 技术架构与设计 智慧监狱的技术架构包括统一门户、信息安全、综合运维、安防集成平台和大数据平台。设计上,智慧监狱采用云计算、物联网、大数据和人工智能等技术,实现资源的动态分配、业务的快速部署和安全的主动防护。 4. 数据治理与应用 监狱数据应用现状面临数据分散和共享不足的问题。智慧监狱通过构建数据共享交换体系、数据治理工具及服务,以及基于数据仓库的数据分析模型,提升了数据的利用效率和决策支持能力。 5. 安全与运维 智慧监狱的信息安全建设涵盖了大数据应用、安全管理区、业务区等多个层面,确保了数据的安全和系统的稳定运行。同时,综合运维平台的建立,实现了IT系统的统一管理和自动化运维,提高了运维效率和系统的可靠性。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值