资料来源:南科大 余仕琪 C/C++ Program Design
LINK:
- CPP/week06 at main · ShiqiYu/CPP · GitHub
- 6.2-function-parameters_哔哩哔哩_bilibili
- 6.3-references_哔哩哔哩_bilibili
- 6.5-inline-function_哔哩哔哩_bilibili
0 概述
本节课主要介绍函数的基础内容。包括:函数参数(按值传递)、数组和指针参数、C 语言样式数组字符串、struct 参数(复制数据或地址)、引用和常量、内联函数(为什么是内联?与宏的比较)。
LAB 6 主要内容为测试整数参数、指针参数和引用参数的示例。
LINK:C++学习日记 | LAB 6 static library 静态库-CSDN博客
1 Functions 函数
本小节介绍函数的基本知识,略。
2 Function Parameters 函数的参数
参数传递有两种方式:pass by value值传递,pass by reference引用传递
-
基础值传递
-
指针传递
![](https://img-blog.csdnimg.cn/direct/eace6fcabbd04c3faf2499ce4aa5ecd0.png)
通过指针传递的实质其实和之前的基本方法是一致的,本质只是将地址传入了函数内,并在函数内对地址所指向的内容进行修改。
-
结构体传递
结构体在函数的传递过程中,首先是由主函数初始化matA结构体,接着在执行函数matrix_max()的过程中新建了一个结构体mat,并拷贝matA的数据进行操作。
所以以上操作过程无疑会存在以下问题:
3 References 引用
- “&” 放在一类变量类型的后面,表示后面的这个是引用
- 引用使得存在“一个人有两个名字”
- 与指针相比,引用更为安全。因为指针存在越界风险,引用则是一个确定的对象
因此,回到函数调用结构体传递存在的问题,可以采用两种方法:使用指针以及使用引用
使用指针时候注意指针的越界风险:如是否对指针+1,是否没有初始化等等
另一种方法是使用引用。引用没有越界的风险,只不过注意如果matrix_max()对mat进行了修改,那么主函数送入的结构体变量也会被修改,因为它们是同一个东西。
如果在函数变量前加上了const,那么就不会被修改。
如果有很多东西需要return:
4 Return statement 返回
略。
5 Inline functions 内联函数
函数调用需要堆栈操作和跳转。对于一些经常被调用的微小函数来说,这是一个沉重的代价。
inline可以一定程度解决上述问题
- inline相当于把函数搬到了程序调用处,避免了执行过程反复调用程序
- inline只能建议编译器采用此方法优化,意味着具体情况下编译器不一定如此优化
lnline和宏
- 看起来宏有很多好处:①在编译前的预处理中直接替换了对应部位的代码,不存在反复调用函数的问题; ②lnline只能返回float类型数据,而宏并不受此限制
- 但是宏存在一些问题:宏只是对文本的搬运,如果宏的输入涉及各类运算后,可能会存在一些潜在的风险,并且在出错后难以察觉原因。因此,宏虽然很方便,但是也很危险,C++中并不鼓励使用宏。