[C++ Primer CH06] 第6章 函数(笔记)

从零开始:使用COLMAP与OpenMVS构建高精度三维Mesh模型 本文为零基础新手提供了使用COLMAP与OpenMVS构建高精度三维Mesh模型的完整实战指南。详细介绍了从环境配置、数据采集黄金法则,到COLMAP稀疏与稠密重建、OpenMVS网格生成与纹理映射的每一步操作,并分享了关键的避坑技巧与参数调优建议,帮助读者从二维照片中成功重建出属于自己的三维模型。 阅读详情

小结:

函数是命名了的计算单元,它对程序(哪怕是不大的程序)的结构化至关重要。每个函数都包含返回类型、名字、(可能为空的)形参列表以及函数体。函数体是一个块,当函数被调用的时候执行该块的内容。此时,传递给函数的实参类型必须与对应的形参类型相容。

在C++语言中,函数可以被重载:同一个名字可以用于定义多个函数,只要这些函数的形参数量或形参类型不同就行。根据调用时所使用的实参,编译器可以自动的选定被调用的函数。从一组重载函数中选取最佳函数的过程被称为函数匹配。


笔记:

我们建议变量在头文件中声明,在源文件中定义。与之类似,函数也应该在头文件中声明而在源文件中定义。


在C++语言中,建议使用引用类型的形参代替指针。


如果函数无须改变引用形参的值,最好将其声明为常量引用。


如何定义函数使得它能够既返回位置也返回出现次数呢?一种方法是定义一个新的数据类型,让它包含位置和数量两个成员。还有另一种更简单的方法,我们可以给函数传入一个额外的引用实参,令其保存字符出现的次数。


将多维数组传递给函数的时,我们处理的时数组的数组,所以首元素本身就是一个数组,指针就是一个指向数组的指针。


为了编写能处理不同数量实参的函数,C++11新标准提供了两种主要的方法:1.如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型;2如果实参的类型不同,我们可以编写一种特殊的函数,也就是所谓的可变参数模板。


在含有return语句的循环后面应该也有一条return语句,如果没有的话该程序就是错误的。很多编译器都无法发现此类错误。


要想确保返回值安全,我们不妨提问:引用所引的是在函数之前已经存在的哪个对象?


在C++11新标准中还有一种可以简化上述func声明的方法,就是使用尾置返回类型(trailing return type)。任何函数的定义都能使用尾置返回,但是这种形式对于返回类型比较复杂的函数最有效,比如返回类型是数组的指针或者数组的引用。


尽管函数重载能在一定程度上减轻我们为函数起名字、记名字的负担,但是最好只重载那些确实非常相似的操作。有些情况下,给函数起不同的名字能使得程序更容易理解。


执行调试代码的方法用到两项预处理功能:assert和NDEBUG。


调用重载函数时应尽量避免强制类型转换。如果在实际应用中确实需要强制类型转换,则说明我们设计的形参集合不合理。


FAQ:

Q1:函数的形参为什么尽量使用常量引用?

A1:1、把函数不会改变的形参定义成(普通的)引用是一种比较常见的错误,这么做带给函数的调用者是一种误导,即函数可以修改它的实参的值。

2、使用引用而非常量引用也会极大地限制函数所能接受的实参类型。

Q2:函数匹配的步骤?

A2:1、函数匹配的第一步是选定本次调用对应的重载函数集,集合中的函数称为候选函数(condidate function)。候选函数具备两个特征;一是与被调用的函数同名,二是其声明在调用点可见。

2、考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数称为可行函数(viable function)。

3、是从可行函数中选择与本次调用最匹配的函数。


Q3:对象的生命周期?

A3:每个对象斗鱼相应的生命周期。块内定义的非静态对象的生命周期从它的定义开始,到定义所在的块末尾为止。程序启动后创建全局对象,程序控制流经过局部静态对象的定义时创建该局部静态对象;当main函数结束时销毁全局对象和局部静态对象。



把 ABAP Unit 测试放进本地类:让重构更安全、让测试更好找的组织方式 ABAP测试代码组织策略:单元测试与集成测试的合理存放位置 本文针对ABAP开发中测试代码组织混乱的问题,提出了一套系统化的解决方案: 单元测试应存放在被测类的本地测试include中(...CCAU或...T99),确保测试与代码同步演进且易于发现 跨对象测试(组件/集成/系统测试)应创建单独的全局测试类,并通过FOR TESTING和ABSTRACT进行防护 使用! @testing注释建立测试关系,使测试与被测对象明确关联,提高可发现性 针对不同技术栈(RAP/CAP/OData)提供了具体落地建议, 阅读详情

相关推荐

CSP-J/S复赛文件组织与freopen读写全攻略,避免爆零

在信息学竞赛的上机考试中,代码能力固然重要,但文件组织与输入输出重定向往往是决定成败的关键细节。许多选手习惯在线评测环境,对本地文件命名、目录层级和读写方式缺乏系统认知,导致算法正确却因文件名拼写错误或freopen使用不当而遗憾失分。理解评测系统的工作原理,掌握从建立准考证号目录到规范命名源文件,再到使用freopen进行文件流重定向的标准流程,是每位参赛者的必备技能。这种工程化习惯不仅适用于CSP-J/S复赛,也是未来参加NOI等更高水平竞赛的基础。本文从文件组织的底层逻辑出发,结合实战案例,系统讲解考

weixin_32466193的博客 591

C++中引用解说(C++ Primer笔记)

C++中引用解说(C++ Primer笔记)***第一部分:参数传递***1. 传递引用参数2. 使用引用避免拷贝3. 使用引用形参返回额外信息(函数需要多个返回值)4. const形参和实参第二部分:转载一 第一部分:参数传递 1. 传递引用参数 对于引用的操作,实际上是作用在引用所引的对象上。 引用形参的行为与之类似,通过使用引用形参,允许参数改变一个或者多个实参的值。 2. 使用引用避免拷贝 拷贝大的类类型对象或者容器对象比较低效,甚至有的类类型(包括IO类型在内)根本就不支持拷贝操作。当某种类型不支

宁静致远的博客 296

【python3.7】解决报错 error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++

解决pip安装py7zr遇到的报错问题。

水w的博客 3936

C++primer小结5-6章

第五章 语句 范围for语句 C++11新标准引入了一种更简单的for语句,这种语句可以遍历容器或其他序列的所有元素。范围for语句的语法形式是: for( declaration : expression) statement vector<int> v; for(auto &r : v) r *= 2; 范围for语句的定义来源于与之等价的传统for语句 for(auto beg = v.begin(), end = v.end(); beg != end; beg++) { a

stephen0208的博客 654

C2000 CLA协处理器:嵌入式实时控制性能优化与实战指南

在嵌入式实时控制系统中,主CPU常因高频率、低延迟的控制算法而面临性能瓶颈。为解决此问题,协处理器技术应运而生,它通过硬件并行架构分担计算密集型任务,从而提升系统整体性能。其核心原理在于独立的计算单元与总线设计,能够实现近乎零延迟的响应,这对于电机驱动、数字电源等闭环控制场景具有极高的技术价值。本文聚焦于德州仪器C2000系列微控制器中的控制律加速器(CLA),深入解析其作为独立浮点协处理器如何通过任务调度与消息RAM通信机制,有效实现性能倍增,并提供了从内存配置到代码调试的完整工程实践方案。

weixin_29192211的博客 302

用 ABAP RAP + XCO 把 Excel 导入业务对象:从弹窗 Action 到 EML 落库与附件清理的完整实践

摘要:本文介绍了在SAP RAP框架下实现Excel批量导入功能的完整方案。通过XCO库的XLSX模块解析Excel文件,结合RAP的行为定义和Fiori Elements界面集成,构建了一个支持试运行、数据校验和自动合并的业务导入功能。方案采用RAP标准范式,包括Action参数设计、EML事务处理、附件管理以及异常消息反馈,实现了从文件上传到数据落库的端到端流程,既保证了系统稳定性,又提升了业务用户体验。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 270

C++中数组

数组形参 数组的2个性质:1不允许拷贝数组;2。使用数组时(通常)会将其转换成指针。 因为不能拷贝数组,所以无法以值传递的方式使用数组参数。因为数组参数会被转换为指针,所以当我们为函数传递一个数组当时候,实际上传递的是指向数组首元素的指针。//形式不同,但是print函数是等价的 void print(const int *); void print(const int []); void pr

LC900730的博客 547

预编码算法(个人总结)

预编码算法是无线通信系统中的关键技术,通过在发送端对信号进行处理,可以有效减少干扰,提高系统性能。预编码算法在5G、Wi-Fi、卫星通信等领域具有广泛的应用前景,同时,随着深度学习、大规模MIMO和物理层安全等技术的发展,预编码算法的研究将进一步推动无线通信技术的发展。CSI的准确性直接影响到预编码的效果。预编码是一种在发送端对信号进行线性变换的技术,以优化信号的空间分布,使得接收端能够更好地接收和解码信号。预编码算法,特别是基于矩阵分解的预编码算法,计算复杂度较高,限制了其在实际系统中的应用。

年糕的博客 5287

C++Primer第五版学习(函数部分 三)

C++Primer第五版学习

xu_fu_yong的专栏 558

PCL 最小生成树用于法向量定向【2025最新版】

PCL 最小代价生成树用于点云法向量的定向。博客长期更新,本文最近更新时间为:2025年9月15日。

点云侠的博客 2067

多周期路径约束(set_multicycle_path )

1.由慢到快的多周期约束 如下图所示,发射时钟周期是接受时钟周期的4倍。默认情况下,按照1T原则来进行静态时序分析和布局布线的。即建立时间是在发射沿后的第一个捕获沿检查,而保持时间是同一时刻下源时钟和捕获时钟的触发边沿下检查的(建立时间检查边沿的前一个触发沿)。 但是这样导致的问题就是该路径过于苛刻,为了满足这条路径的要求,不得不放弃其他路径。或者根本没办法保证这个默认的约束。总之最终造成...

Arist. 5505

[C++ primer] 第六章习题答案

[C++ primer] 第六章习题答案6.16.26.46.56.66.86.106.126.136.156.166.176.186.196.206.216.226.246.256.276.286.29 6.1 实参时形参的初始值。 形参是定义在函数参数列表中的局部变量, 等待被实参初始化。 实参是调用函数时给形参赋予的初始值。 6.2 (a)返回类型不匹配 (b)函数没有标明返回类型 (c)形...

u013081759的博客 1238

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++ Primer Chapter 6 Functions

注:CPP Primer这本书从第六章开始学习,学习过程中涉及之前章节的内容,将会跳至相应章节学习。

qq_22609521的博客 715

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++ Primer 读书笔记-ch02

#1. 引言 数据类型是程序的基础,决定了编译器以及运行时的各项操作解释。在编译时不同的变量应该分配多大的空间?在运行时对指针进行+1操作,指针应该跳几个字节?在类型明确的情况下,上述操作都有据可循,不会有歧义。C / C++ / JAVA / C#等语言都明确定义了数据类型。我个人也是比较偏...

chitun9294的博客 184

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C 语言学习笔记

B站up Micro_Frank C语言大师系列课程笔记

g_c_m_g的博客 1221

Arduino入门实战:从硬件思维到项目开发的全流程解析

物理计算是连接数字世界与物理世界的核心技术,它通过微控制器读取传感器数据并控制执行器,实现对现实环境的感知与交互。其原理基于嵌入式系统的实时响应与信号处理,技术价值在于降低了硬件开发门槛,使开发者能快速实现智能硬件原型。在智能家居、机器人、物联网等应用场景中,Arduino作为开源硬件平台,以其易用性和丰富的生态成为入门首选。本文以Arduino入门课程为切入点,深入解析如何构建硬件思维,涵盖数字/模拟信号处理、传感器集成和电机控制等核心技能,并通过智能台灯、避障小车等实战项目,系统讲解从电路搭建、代码调试

weixin_33748818的博客 419

《C++ Primer》笔记 第6章 函数

任意两个形参都不能同名,而且函数最外层作用域中的局部变量也不能使用与函数形参一样的名字(形参就相当于该函数的局部变量)。 形参名是可选的,但是由于我们无法使用未命名的形参,所以形参一般都应该有个名字。某类形参通常不命名以表示在函数体内不会使用它。不管怎样,是否设置未命名的形参并不影响调用时提供的实参数量。即使某个形参不被函数使用,也必须为它提供一个实参。 在C++语言中,名字有作用域,对象有生命周期。 名字的作用域是程序文本的一部分,名字在其中可见。 对象的生命周期是程序执行过程中该对象存在的一段时间。 .

zhoumouren88的博客 359

C++ Primer5 第六章课后练习 学习笔记

传值参数与传引用参数 #include<iostream> using namespace std; void a(int); //传值参数 void b(int&); //传引用参数 int main() { int s = 0, t = 10; a(s); // 1 cout <<...

LFT24的博客 287

不要返回局部对象的引用或指针

Primer C++ 第五版中文版 P201页提到了不要返回局部对象的引用或指针

vvincentqiao的专栏 1383

一、函数的定义、调用、返回值、参数。

一、函数介绍 1.1:函数是什么? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。 1.2:为什么要使用函数?    1.避免代码重用    2.提高代码的可读性 二、函数的定义与调用 2.1:定义...

weixin_30826095的博客 749

函数(三):返回类型和 return 语句

<基于 C++ Primer P199> 1.无返回值的函数 只有返回类型是 void 的函数。 可以不使用 return 语句,会隐式地执行。若想在中间位置提前退出,可以使用 return 语句。可以使用 return 语句返回另一个返回 void 类型的函数。 2.有返回值的函数 在含有 return 语句的循环后面应该也有一条 return 语句。 (1)值是如何被返回的: 返回一个值的方式和初始化一个变量或形参的方式完全一样:返回值用于初始化调用点的一个临时量,该临时量就是函数调用的结果

Pairshoe的博客 1517

《C++ Primer》第6章 6.3节习题答案

《C++ Primer》第6章 6.3节习题答案

chenyijun的专栏 379

c++返回函数局部对象的引用

函数千万不要返回局部对象的引用或指针     局部变量在函数里面,当函数执行结束后将释放局部变量,如果返回引用或批针这个时候引用或指针指向所指向的内存空间已经释放。指针和引用将是垂悬指针。很危险! 但是如果返回的“局部变量”是堆中的内存值就可以返回了 C++函数为什么要使用引用? C语言之中大量利用指针作为形参或者函数返回值,这是由于值拷贝会有很大的消耗(比如传入传出一个大

大灰狼的专栏 1万+

(6)函数

内置类型的未初始化局部变量将产生未定义的值。 某些时候, 有必要令局部变量的生命周期贯穿函数调用及之后的时间。可以将局部变量定义成static类型从而获得这样的对象。 局部静态对象在程序的执行路径第一次经过对象定义语句时初始化, 并且直到程序终止才被销毁, 在此期间即使对象所在的函数结束执行也不会对它有影响。如果局部静态变量没有显式的初始值, 它将执行值初始化, 内置类型的局部静态变量初始化为0(1

翱翔 420

C++11线程中的几种锁

线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,锁的功能与性能成反比。不过我们一般不使用递归锁(C++标准库提供了std::recursive_mutex),所以这里就不推荐了。 互斥锁(Mutex) 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是为了避免多个线程在某一时刻同时操作一个共享资源。例如线程池中的有多个空闲线程和一个任务队列。任何是一个线...

xy_cpp的博客 6万+
上一篇: [C++ Primer CH05] 第5章语句(笔记)
下一篇: [C++ Primer CH07] 第7章 类(笔记)
xy_cpp
博客等级 码龄10年 119粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值