Chapter 6 Basics of Functions
Function
Why functions?
如果我们想求三个矩阵变量中的最大数值,没有function就会
写三遍,那么代码规模大且复杂的时候,就会非常难维护。
于是使用函数!
三个方框分别是返回类型,函数名和参数列表。
这样的话我们不用反复写了,只要用函数的方式就可以求各种矩阵的最大值。
A Question
传输进来的数值要提前检查一下。
Where should a function be?
Option 1
第一种方式就是在调用前把全部实现都写出来,但是函数多了,每个函数实现的先后顺序不好确定。
Option 2
注意方框中的x1,x2,x3,x4可以去掉,这种方式后面的函数不用管先后顺序,好一些。
Option 3 using it!
把声明和实现分开放置
How are functions called?
Function Parameters (important)
Parameters
The symbolic name for "data" that passes into a function.
Pass by value
fundamental type
num1有没有改变?
绝对没有,因为都是拷贝,是拷贝体发生的改变
pointer
address的拷贝,里面的p和外面的p不是一个p,但是按照地址进行的操作修改没问题。
structure
也就是说里面和外面是不影响的,因为就是两个东西,就像是克隆人一样,在克隆人身上的操作不影响原来的人。
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++
定义方法
int & num_ref = num.
这意味着同一个memory有两个名字如右边所展示。两个名字对应同一个数据。
几种不同的方式对比(有参考价值)
更多说明
• 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
注意,这种办法要全部复制一遍,浪费空间时间
指针解决方案
引用解决方案
就多加个&就可以,右边的方案相当于同一个人的别名,对他修改直接影响之前的内容。
避免误操作修改
Return statement
return是一种拷贝,他是传输数值。
If we have a lot to return(注意下这种方式)
Similar mechanism in OpenCV
• Matrix add in OpenCV
https://github.com/opencv/opencv/blob/master/modules/core/src/arithm.cpp
Inline functions
在 C++ 中,你可以通过在函数定义前加上 inline
关键字来声明一个 inline
函数:
inline int add(int a, int b) { return a + b; }
Why not use a macros?
注意这种替换是全面替换。
很危险的。
同时带参数的一定要加括号,否则替换之后的优先级可能出现问题。
Chapter 2 Data Types and Arithmetic Operators#Arithmetic operators