Chapter 6 Basics of Functions

Function

Why functions?

Pasted image 20241008111714.png
如果我们想求三个矩阵变量中的最大数值,没有function就会
Pasted image 20241008112116.png
写三遍,那么代码规模大且复杂的时候,就会非常难维护。
于是使用函数!
Pasted image 20241008112327.png
三个方框分别是返回类型,函数名和参数列表。
这样的话我们不用反复写了,只要用函数的方式就可以求各种矩阵的最大值。

A Question

Pasted image 20241008112659.png
传输进来的数值要提前检查一下。

Where should a function be?

Option 1

Pasted image 20241008113355.png
第一种方式就是在调用前把全部实现都写出来,但是函数多了,每个函数实现的先后顺序不好确定。

Option 2

Pasted image 20241008113506.png
注意方框中的x1,x2,x3,x4可以去掉,这种方式后面的函数不用管先后顺序,好一些。

Option 3 using it!

Pasted image 20241008113914.png
把声明和实现分开放置

How are functions called?

Pasted image 20241008114028.png

Function Parameters (important)

Parameters

The symbolic name for "data" that passes into a function.

Pass by value

fundamental type

Pasted image 20241008122646.png

Question

num1有没有改变?

绝对没有,因为都是拷贝,是拷贝体发生的改变

pointer

Pasted image 20241008122808.png
address的拷贝,里面的p和外面的p不是一个p,但是按照地址进行的操作修改没问题。

structure

Pasted image 20241008123353.png
也就是说里面和外面是不影响的,因为就是两个东西,就像是克隆人一样,在克隆人身上的操作不影响原来的人。

Question

• If the structure is a huge one, such as 1K bytes.
• A copy will cost 1KB memory, and time consuming to copy it.

Pass by reference

reference意味着引用。在c++中有,c里面没有。

References in C++

Pasted image 20241008123734.png定义方法
int & num_ref = num.
这意味着同一个memory有两个名字如右边所展示。两个名字对应同一个数据。

几种不同的方式对比(有参考价值)

Pasted image 20241008124324.png

更多说明

• A reference must be initialized after its declaration.必须要这样,声明的时候就要指出来是跟谁代表一块memory

int & num_ref; // error
Matrix & mat_ref; // error

• Reference VS Pointer: References are much safer
pointer越界等问题能解决一些。

Function parameters with a huge structure

Pasted image 20241008124737.png
注意,这种办法要全部复制一遍,浪费空间时间

指针解决方案

Pasted image 20241008124843.png

引用解决方案

Pasted image 20241008124951.png就多加个&就可以,右边的方案相当于同一个人的别名,对他修改直接影响之前的内容。

避免误操作修改

Pasted image 20241008125217.png

Return statement

Pasted image 20241008125436.png

Pasted image 20241008130422.png
return是一种拷贝,他是传输数值。

If we have a lot to return(注意下这种方式)

Pasted image 20241008130543.png
Similar mechanism in OpenCV
• Matrix add in OpenCV
https://github.com/opencv/opencv/blob/master/modules/core/src/arithm.cpp
Pasted image 20241008130702.png

Inline functions

Pasted image 20241008131417.png

Pasted image 20241008131510.png

在 C++ 中,你可以通过在函数定义前加上 inline 关键字来声明一个 inline 函数:

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

Pasted image 20241008131525.png

Why not use a macros?

注意这种替换是全面替换。
Pasted image 20241008131850.png
很危险的。
Pasted image 20241008133454.png
同时带参数的一定要加括号,否则替换之后的优先级可能出现问题。
Chapter 2 Data Types and Arithmetic Operators#Arithmetic operators
Pasted image 20241008132435.png
Pasted image 20241008132337.png