Chapter 7 Advances in Functions

Default Arguments(difference between Parameter and Argument)

Pasted image 20241010193103.png
注意这只有在C++中才适用,C中无法使用!

同时方框里面的三种全部对应下面的函数体。

Function Overloading

Pasted image 20241010194841.png

Pasted image 20241010194936.png
c++中同时判断函数名和参数列表,参数列表和函数名全部相同才是同一个函数。
Pasted image 20241010195505.png

但是返回类型不考虑,也就是说,如果有两个函数体,函数名和参数列表完全相同,但是return type不一样的话,他们过不了编译器。

如果输入类型是int x,float y的两个参数比如说输入是2,2.2,如果这个时候有函数overload,那么编译器会报错,因为发生了ambiguous。

Function Templates 这块有点不是特别懂

Why function templates

Pasted image 20241010195942.png
如果上面三个函数有300行代码,那么维护起来特别麻烦,因为他们的实现逻辑相同,我们可以有更好的办法来写这个函数,而不是写三遍。

Explicit instantiation

Pasted image 20241010200807.png
编译器看到第一段方框的时候不会执行,因为他也不知道该怎么做加法(不知道类型),但是要实例化。

看到第二段方框的时候,生成三个不同的函数,就像三个overload的函数。

再执行的时候就可以按照上面的overload一样的概念来执行。

Question

既然已经提供了返回类型和函数参数类型,为什么还需要显式提供模板参数呢?

模板函数的编译器行为取决于 模板参数推导显式实例化 的规则。在某些情况下,编译器无法通过函数参数或返回类型唯一地确定模板参数,因此我们需要显式指定 <> 中的模板参数。

template double sum<double>(double, double);

template double
这是模板的返回类型,表示 sum 函数的返回值类型是 double
sum<double>
这是模板的显式实例化部分,表示我们要求编译器为模板参数 T 生成double 类型的函数实例。这个里面的double就替换了模板中的T。

template<typename T> T sum(T x, T y) { return x + y; }

通过 sum<double>,我们明确告诉编译器,这里的 T 应该被替换为 double

Implicit instantiation

再探第二个方框。

Pasted image 20241010205502.png

Function template specialization

Pasted image 20241010205722.png
但是这种咋办?我们的+不可以对这种type进行加法运算啊!!x是一个结构体,y是一个结构体,结构体相加会报错的!!

还有特例化
Pasted image 20241010210141.png

Function Pointers and References

Function pointers

Pasted image 20241010210701.png
其中第三行给出了函数指针的定义方式。

注意函数指针必须指向跟他定义的时候有完全相同的参数type和返回type.

Pasted image 20241010211152.png

Function references

Pasted image 20241010211226.png

注意括号绝对不可以省略!!也必须要开始就初始化。

Recursive Functions

就简单介绍下。
Pasted image 20241010211509.png

Pasted image 20241010211516.png