第三章 函数 (郑莉版C++程序语言设计学习笔记)

/*学习笔记*/《c++语言程序程序设计(第4版)》郑莉 清华大学出版社 前言:大一时候学过少部分C,有一定基础,想在大二暑假利用实习期间将C++基本掌握。基于郑莉的教材,虽然略显冗杂和陈旧,但是相对比较详细,解析也比较清楚。此文章相当于读书笔记,供日后自己温习用,也供读者参考,欢迎指正和批评。第一章~第三章 主要讲的是语法、字符、函数一类的,与C相差不大,故快速略过。第四章 类与对象 面向对象程序设计基本特点:抽象,封装,继承,多态。 抽象:概括提取出问题的 阅读详情

在面对面向过程的程序设计中,函数是模块划分的基本单位,是对处理问题的抽象
在面向对象的过程中,是对功能呢搞得抽象

3.1函数的定义和使用

主函数是程序执行的开始点。
调用其他函数的函数被称为主调函数。
被其他函数调用的函数被称为被调函数

3.1.1 函数的定义

语法形式
类型说明符 函数名 (含类型说明的形式参数表)
{
语句序列
}
形式参数

type1 name1,type2,name2.。。。,typen namen

main函数的形参是命令行参数,由操作系统进行初始化。

函数在没有调用的时候是静止的,此时的形参只是一个符号,它标志着在这个位置应该出现一个什么类型的数据。当函数被调用的时候,由主调函数实际参数(实参)赋予形参。

3.1.2 函数的调用

函数的调用形式
(略)

  1. 函数调用形式
  2. 嵌套调用
  3. 递归调用(汉诺塔问题)

3.2内联函数

函数调用时可以使用内联函数减少调用的开销。(把代码贴在被调用部分)
内联函数不是在调用时发生控制转移,二十在编译时将函数体嵌入在每一个调用处。节约了参数传递,控制转移等开销。
定义方式
inline 类型说明符 函数名(含类型说明的形参表)
{
语句语序
}
只需加上关键字 inline
inline关键字只是表示一个要求,编译器并不承诺将inline修饰的函数作为内联函数。
在现代编译器中,没有声明为内联函数的函数。通常,应该将简单函数定义为内联函数,结构简单,语句少。如果将复杂函数定义为内联函数,会造成代码膨胀,增大开销,这时编译器会自动将其转换为普通函数来处理。
处理策略有不同编译器不同决定。

3.3带有形参默认值的函数

函数在定义时可以预先声明带有默认的形参值。
调用时如果给出了实参,则使用实参初始换形参,否则,采用预先声明的默认形参值。
例如:

int add(int x = 5, int y =6){ //声明的形参默认值
		renturn x+y;
}

int main(){
add(10,20);//实参初始换形参
add(10);//形参采用实参10,y蚕蛹默认值6
add();//x,y都采用默认值,分别是5,6

}	

有默认值的形参必须在形参列表的最后,即有默认值的在形参表的右面。
int add(int x, int y, int z);//对
int add(int x = 1,int y =5,int z);//错
int add(int x =1,int y ,int z = 6);//错

在相同作用域中,不允许一个函数的多个声明中对同一个参数的默认值重复定义,即使前后定义值相同也不行。

3.4函数重载

两个以上函数,具有同样的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型的最佳匹配,自动决定调用那个函数,这就是函数的重载。

如果函数值相同,形参个数和类型也相同,是语法错误。
习惯
不要将不同的功能的函数定义为重载函数。以免出现对调用结果的误解和混淆。

3.5C++系统函数

C++的系统库提供了几百个函数可供程序员使用。
程序员需要使用include指令嵌入头文件。

3.6深度探索

3.6.1 运行栈和函数调用的执行

变量定义写在函数以外的变量叫做全局变量,作用于全局。
写在函数内的叫做局部变量,作用于函数,区别是作用域。
问题:

  1. 局部变量生存周期小于程序的运行周期,如果为每个局部变量分配内存空间,空间利用率会下降。
  2. 发生递归调用时,存在当一个函数尚未返回,对它的另一个调用又发生的情况,对于多次调用,相同,名称的变量会有不同的值,这些值又必须同时保存在内存中, 而且不能互相影响,因此他们必须有不同的内存地址,但又不能分配唯一确定的地址。

所以,需要一种特殊的结构,就是栈。

栈

定义(略)
一组嵌套的函数调用的特点是,越早开始调用,返回的越晚。其形参和局部变量生效的越早,失效的越晚,自然可以用栈结构来储存,这种栈叫做运行栈。

  1. 运行栈实际上是一段区域的内存空间,与储存全局的区别只是,寻址方式的差别。
  2. 运行栈中的数据分为一个一个栈帧,每个栈帧对应一个函数调用,栈帧中包含这次形参值,一些控制信息和一些临时数据。
函数调用的执行过程

IA-32(i386)中,esp寄存器就是用来记录栈顶地址的,称为栈指针。
但是,只有一个寄存器储存栈顶地址,还不够用,因为有些函数的栈帧大小是不确定的,这就会在函数返回前恢复栈指针时遇到麻烦,因此还需要另一个寄存器保存函数刚被调用时栈指针的位置。
IA-32中,ebp寄存器来完成这一任务,称为帧指针。
形参和局部变量相对于帧指针的位置是确定的,函数的形参和局部变量的地址尝尝通过帧指针来计算。
举例:

int add(int a,int b){
int c = a+b;
return c;
}

int x =add(a,b);
主函数汇编代码如下:
8048459: movl $ 0x7,0x4(%esp) //write 7 to address (esp+4)
8048461: movl $ 0x5,(%esp) //write 5 to address (esp)
8048468: call  8048434  //call the function in 8048434
804846d:mov %eax,-0x8(%ebp) //write the value of eax to address(ebp-8)
地址位
被调函数汇编代码:
8048434: push %ebp		//将帧指针ebp的值压入运行栈
8048435: mov %esp,%ebp	//将栈指针esp的值赋给帧指针ebp
8048437: sub $0x4,%esp	//栈指针减去4
804843a: mov 0xc(%ebp),%eax //ebp+12地址内的整数载入eax寄存器
804843d: add 0x8(%ebp),%eax //ebp+8地址内的整数与eax寄存器内的原值相加
8048440:mov %eax,-0x4(%ebp) //eax寄存器内的值存入ebp-4地址内
8048443: mov -0x4(%ebp),%eax //将ebp-4地址内的整数装入eax寄存器中。
8048446: leave //恢复函数调用之初esp和ebp的值
8048447: ret //返回主调函数

3.6.2函数声明与类型安全

如果在调用一个函数前必须声明函数原型,就能够避免向一个函数传递数量不正确或类型不正确的的参数。因为在提供声明的情况下,执行函数调用,若传递的参数数量和类型不正确,编译器很容易检查出来。
进一步原理
不同类型的数据,在内存中都以二进制序列表示,在运行时并没有保存类型信息。有关类型的特性,全部蕴含在数据所执行的操作之中。所以,在使用变量前必须声明,这样才可以为某比那里那个所参与的每一个操作赋予完整的意义。函数在使用前必须声明,也是类似的原因。
一个函数的原型信息(参数个数,类型和返回值类型),并没有写在编译后的机器语言中,二十全部蕴含在了这个函数所执行的操作之中。

清华大学郑莉教授C++语言程序设计课件全集 C++是一种广泛使用的编程语言,由Bjarne Stroustrup在1980年代初期在贝尔实验室开发,作为一种改良的C语言,它继承了C语言的诸多特性,同时增加了面向对象编程(OOP)的能力。C++被设计为能够高效地管理内存和处理低层次的硬件细节,同时提供更加高级的抽象。 阅读详情

相关推荐

清华大学郑莉教授的C++程序设计课程课件精要

C++是一种静态类型的、编译式的、通用的编程语言,它支持过程化编程、面向对象编程以及泛型编程。C++被广泛用于系统/应用软件开发、游戏开发、驱动程序编写、实时物理模拟等领域。在本章中,我们将介绍C++的基础知识,为读者打下坚实的编程基础。设计模式是软件工程中解决特定问题的最佳实践。它们是经过反复验证的解决方案模板,可应用于软件设计的多个方面。面向对象设计模式特别关注如何通过类和对象的组织来适应设计问题。模式的种类:设计模式大致可以分为创建型模式、结构型模式和行为型模式。

weixin_35509395的博客 1146

C++运行栈与函数调用的执行

1、运行栈工作原理C++变量在运行时依靠地址加以区分。变量的定义全部写在函数以外,这样的变量叫做全局变量。变量的定义放在一个函数之内,这样的变量叫做局部变量。全局变量,在目标代码中都是用一个唯一确定的地址定位的。然而,对于全局变量却不能如此,这是因为:(1)局部变量只在调用它所在的函数时才会生效,一旦函数返回后就会失效。很多局部变量的生存周期远小于整个程序的运行周期,如果为每个局部变量分配不同的空...

跟着BOSS有肉吃 3273

郑莉C++程序设计教程第3版:全面掌握C++基础与高级特性

C++是一种静态类型、编译式、通用的编程语言,广泛应用于系统/应用软件开发、游戏开发、驱动程序等,以其效率高和面向对象特性深受开发者喜爱。在 C++ 中,类是创建对象的蓝图或模板。类定义了对象将拥有的方法和变量。对象是根据类定义创建的实例。public:// 公有成员变量void memberFunc() { // 公有成员函数// 操作代码// 创建对象// 访问成员变量// 调用成员函数return 0;在上述代码中,MyClass是一个类,包含一个公有成员变量。

weixin_30789053的博客 534

产生嵌套函数先调用的后结束的原因

话不多说,先上嵌套函数的代码: public class TestDemo5 { public static void main(String[] args) { System.out.println("main开始"); m1(); System.out.println("main结束"); } public static ...

plutomate的博客 1667

《C++语言程序设计》郑莉版电子课件精讲

本文还有配套的精品资源,点击获取 简介:《C++语言程序设计》电子课件由著名教授郑莉编著,专为编程初学者和进阶者设计。该课件深入浅出地介绍了C++的面向对象特性、基础语法和高级功能,并结合实例展示其在软件开发中的应用。电子课件形式使得学习更高效,易于理解和掌握。学习C++,不仅可以提升编程技能,还能为学习其他编程语言打下良好基础。课程内容包括基础语法、控制结构、函数、数组、...

weixin_35752122的博客 1623

清华大学郑莉版C++教程(高清文字版)

C++是计算机编程语言中最为强大和复杂的一种语言之一。它的广泛使用源自于它的多功能性和灵活性,可以用来创建从操作系统到游戏等各类软件。本章将介绍C++的基础语法,为那些刚刚接触这门语言的读者打下坚实的基础。类是面向对象编程中定义对象属性和行为的蓝图或模板。一个类可以包含多个类型的数据成员,以及多个可以操作这些数据成员的函数成员。对象是类的实例,是根据类定义创建的实体。以下是定义一个简单的C++类的例子:public:// 构造函数// 公有成员函数private:// 私有数据成员。

weixin_28235889的博客 784

带默认形参值的函数说明

我是在做这道题时疑惑后,翻看资料记录一下: 在C++中,关于下列设置参数默认的描述中,( C )是正确的。 A. 不允许设置参数的默认值。 B. 设置参数默认值只能在定义函数时设置。 C. 设置参数默认值时,应该是先设置右边的再设置左边的。 D. 设置参数默认值时,应该全部参数都设置。 说明:有默认值的形参必须在形参列表的最后,即在有默认值的形参右边,不能出现无默认值的形参。实参与形参是按...

weixin_43689161的博客 3938

Pulpino SoC中挂载AXI从机接口的自定义IP说明

AXI 从机接口挂载 Pulpino SoC 调试Pulpino SoC中挂载AXI从机接口的自定义IP说明PULPion SoC介绍自定义AXI IP挂载IP挂载框图代码修改脚本修改自定义AXI IP调试C语言编写软件调试硬件调试 Pulpino SoC中挂载AXI从机接口的自定义IP说明 本篇文章主要从工程的角度描述了如何将具有AXI从机接口的自定义IP挂载到Pulpino SoC上,其中不涉及到SoC中的任何原理知识。 PULPion SoC介绍 PULPion SoC整体架构如下图所示, PULPi

小陈的芯片学习之路 2208

C++函数的定义与使用

函数的定义和使用main就是一个函数,它是C++程序的主函数。一个C++程序可以由一个主函数和若干子函数组成。主函数是程序执行的开始点。由主函数调用子函数,子函数还可以再调用其它子函数。调用其它函数的函数称为主调函数。被其他函数调用的函数称为被调函数。一个函数很可能既调用别的函数又被其它函数调用。1.函数的定义1.1函数定义的语法形式类型说明符   函数名(含类型说明的形式参数表){   语句序列...

跟着BOSS有肉吃 4万+

Linux双网卡设置IP属于同一网段的ping方法以及现象记录分析

文章目录前言ping以及MAC地址总结 前言 写在前面:经常遇到客户将板卡上的两个网络设备的IP地址设置为同一网段的情况,比如eth0:192.168.0.232,eth1:192.168.0.30. 我的解释是,不能设置为同一网段,或者使用其中一个时候下线另外一个网卡。但是我不知道这个说法到底是根据什么,查了很多资料也没找到明确的说法,但是下面这个实验能够说明一些现象的原因。 ping以及MAC地址 首先查看网卡的信息 ifconfig 因为两个网卡都在同一个网段,所以如果这个时候直接和我们的主机(I

“逛丢一只鞋”的博客 1万+

YOLOv11-Pose部署RK3588实战:人体姿态识别精度翻倍,边缘推理速度突破瓶颈

本教程从YOLOv11-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

m0_64661770的博客 138

带默认形参值的函数

函数的定义属于声明。 在相同的作用域内,不允许在同一个函数的多个声明中对同一个参数的默认值重复定义。 如果一个函数在定义之前又有原型声明,默认形参值需要在原型声明中给出,定义中不能再出现默认形参值。 在类的成员函数中,默认形参值一定要写在类定义中,不能写在类定义之外的函数实现中。 ...

duxinyu_的博客 1609

华为FusionCompute之计算虚拟化

华为FusionCompute之虚拟化

jks212454的博客 2452

c++语言程序设计(郑莉)学习笔记(详细中的详细)

前一阵子上传了一个C++学习笔记资料,反响平平,无人下载,所以今天写一篇博客来推荐一波我的笔记。 该xmind笔记是我在2020年准备东南大学复试期间写下的,内容是我在反复学习《C++语言程序设计(郑莉)》书籍,以及哔哩哔哩上的197集清华大学公开课的基础上,总结而成的,内容可说是非常详细了,最后一遍的时候,我把编程时的一些要注意的细节也添上去了,无论是正在学习C++的新学者,还是准备C++考研复试的学生,或者正在准备C++面试的求职者,都可以来看,电脑手机都可以看,ipad竖屏最佳。 总体框架:

我有明珠一颗的博客 5824

R语言 百度坐标转换至WGS84坐标

本文利用R语言封装了百度坐标转换至WGS84坐标的函数,亲测有效,提供了便捷的百度坐标转换方法。

qingchen98的博客 2135

【2024遥感应用组一等奖】基于风云四号卫星的小时级大气气溶胶和颗粒物监测

最后,比较AGRI观测反射率和查找表计算的反射率反演得到的1小时分辨率AOD数据。然后,使用广泛应用的MODIS DT和DB产品进行对比,图 5显示了它们逐像元尺度的对比,AGRI LaGA算法可以捕捉亚洲地区AOD高低值空间分布格局,比如南亚次大陆、中南半岛、塔克拉玛干沙漠和华北平原是AOD高值区域(平均AOD高于0.3),中国西北、中国南方、中国东北和韩国地区为AOD中值地区(平均AOD在0.2到0.3之间),北纬45度以上以及日本地区为AOD低值区域(平均AOD小于0.2),与全球平均AOD值接近。

JData_Engineer的博客 372

C++语言程序设计(第5版 郑莉、董渊)学习笔记

C++程序 整理笔记后续复习使用 前三章 大多关于C 后面的 才是真正C++精华软件:各种程序+文档资料 指令:计算机可识别的命令(所有指令的集合叫做指令系统) 汇编语言:将机器语言映射为一些可被读懂的助记符 eg:ADD 高级语言:屏蔽机器细节,采用有一定含义的数据命名和执行语句 面向对象的语言:为了能更直接地描述客观世界中存在的事物面向对象的编程语言将客观事物看作具有属性和行为(或称服务)的对象,通过抽象找出同一类对象的共同属性和行为,形成类。①自顶向下、逐步求精; ②程序结构按功能划分为若干个基本模块

陕西师范大学 人工智能 周一卓 的博客 1万+

大模型复杂问答能力评测框架:从原理到实践

在人工智能领域,大语言模型(LLM)的评估是衡量其实际应用价值的关键环节。其核心原理在于通过系统化的评测框架,对模型的理解、推理、整合与表达能力进行量化分析。传统的NLP基准测试往往侧重于事实性检索或简单推理,难以全面反映模型在应对多跳推理、隐含条件、长上下文整合等复杂现实任务时的真实性能。因此,专门针对复杂问答设计的评测技术应运而生,其价值在于为模型选型、效果优化和瓶颈诊断提供数据驱动的科学依据。该技术广泛应用于需要深度逻辑判断的业务场景,如智能投顾、法律咨询、医疗诊断等。本文聚焦的`tan92hl/Co

weixin_28679635的博客 361

最值得收藏的 C++ 清华大学郑莉版全部知识点思维导图整理, 东南大学软件工程初试906科目

本文的思维导图根据清华大学郑莉出版的C++书籍整理而来并标记出重点内容,适用于想考东南大学软件工程906的同学 思维导图源文件已经发布在我的资源当中,有需要的可以去 我的主页 了解更多学科的精品思维导图整理 本文可以转载,但请注明来处,觉得整理的不错的小伙伴可以点赞支持一下哦! 一、绪论 二、C++简单程序设计 三、函数 四、类与对象 五、数据的共享与保护 六、数组、指针与字符串 七、继承与派生 八、多态性 九、群体类和群体数据的组织 十、泛型程序设计与C++标

孤柒的博客 2万+

Moviepy自动化剪辑视频中的广告

本教程展示了如何使用 Python 中的 MoviePy 库,通过检测和剪辑广告段落来实现视频内容的清洁播放。通过广告检测算法和 MoviePy 剪辑功能的结合,可以自动化处理视频,极大提升编辑效率。在学习和应用中,理解广告检测的原理及其实现方法尤为重要,以便针对不同类型的视频进行调整。此外,MoviePy 的灵活性使其适用于多种视频编辑场景,适合自动化内容制作与优化。

Mr数据杨 3407

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

郑莉《C++》第三章总结

3_2 rsomeref=inttwo 为什么也能改变rsomeref的值,引用不是只能用一次吗?在C++中,引用是一种特殊的变量类型,它本质上是一个变量的别名。引用在后就不能再绑定到其他变量,但它所绑定的变量的值是可以改变的。初始化是通过符号实现的:int &r = one;// 引用 r 初始化并绑定到变量 one3_3值传递和引用的概念值传递:实参到形参的单向传递'&'引用:实参与形参的双向传递3_4内联函数(不用管这个概念)使用关键字inline的函数。三个使用的要求。

weixin_65847149的博客 470

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

郑莉老师c++第五版+b站视频 学习笔记

c++

qq_42863961的博客 1568

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

第三章 函数 C++语言程序设计第五版 - 郑莉

本专栏为C++学习笔记,参考书籍为:C++语言程序设计 第五版 -清华大学出版社- 郑莉 B站视频:https://space.bilibili.com/702528832/video PPT与代码已上传:https://download.youkuaiyun.com/download/weixin_45755332/75626784 版权归原作者所有如有侵权请立即与我联系,必将及时处理。 本想考东软的,结果今年缩招,直接改隔壁科软,当时的学习笔记发出来供大家参考指正。科软23分肯定会升,但肯定不会到380,撑死350

小白不白 2305

【免费下载】 C++语言程序设计第五版郑莉资源下载

C++语言程序设计第五版郑莉资源下载 【下载地址】C语言程序设计第五版郑莉资源下载 本仓库提供了《C++语言程序设计第五版》(作者:郑莉)的PPT课件与相关代码资源。这些资源旨在帮助学习者更好地理解和掌握C++编程语言,适用于课程学习、复习备考以及实际编程练习。 ...

gitblog_09787的博客 2884

【免费下载】 C++语言程序设计第四版郑莉资源下载

C++语言程序设计第四版郑莉资源下载 【下载地址】C语言程序设计第四版郑莉资源下载 本仓库提供《C++语言程序设计第四版郑莉》的资源文件下载。该书由郑莉编写,是学习C++编程的经典教材之一。无论你是初学者还是有一定编程经验的开发者,这本书都能为你提供系统而深入的C++语言知识 ...

gitblog_09710的博客 755

C++语言程序设计 清华大学郑莉(第4版)资源下载

C++语言程序设计 清华大学郑莉(第4版)资源下载 去发现同类优质开源项目:https://gitcode.com/ 本仓库提供了《C++语言程序设计 清华大学郑莉(第4版)》的资源文件,旨在帮助读者更好地学习C++语言。该资源文件包含了丰富的内容,包括C语言、C++语言的基础知识及清华大学郑莉教授的专业讲解。 以下是资源文件的详细描述: 标题:C++语言程序设计 清华大学郑莉(第4版) 描述:...

gitblog_06799的博客 295
上一篇: 第二章 C++简单程序设计 (郑莉版C++程序语言设计学习笔记)
下一篇: 第四章 类与对象 (郑莉版C++程序语言设计学习笔记)
include666
博客等级 码龄9年 12粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值