函数在使用之前需要预先定义,定义函数的语法为:
类型声明 函数名(类型声明 形式参数) {语句;}其中类型声明决定了这个函数return何种类型,同时return执行后函数的执行就此结束;如果函数不需要返回值则使用void作为类型声明。比如下面定义的square()函数用于求整数类型的平方:
int
2、函数的使用 在
使用之前必须预先定义或者声明这个函数,如果函数A()调用函数B(),那么A()称为主调函数,B()称为被调函数。下面的例子展示了main()函数调用square()函数:
int
由于square()函数的声明是在main()函数内部的,所以它的有效性也只在main()内部。
3、函数参数为值传递在函数调用过程中,形参的值是由实参初始化的。
这一过程仅仅把实参的值传递给形参,将形参的值改变并不会影响到实参(python传递的是引用,所以会改变可变数据类型的值),比如下面的的add_five()函数:
int
如果在main()函数中调用add_five()函数,并不会改变main()中变量的值:
int
4、函数参数为引用传递 值传递是不能改变实参数值的,所以需要一种能够改变实参数值的方式。
形参的初始化不在函数声明或者定义时进行,而是在主调函数进行调用时进行,也就是采用实参来初始化形参。C++中可以通过引用来实现这一功能,自己目前认为引用就是指针的一种语法糖,或者说是指针的子集。引用仅仅是对象的别名,对引用进行操作和对对象进行操作是等价的。引用包含下面要点:
- 创建引用的同时必须采用已经存在的对象进行初始化;
- 引用创建后不能指向其它的对象的;
引用的声明格式为:
类型声明 &引用名=变量名下面的例子通过对变量a的引用来改变a的值:
int
现在重新改写add_five()函数,使其形参data为引用:
int
现在再次在main()函数中调用add_five()函数就能改变变量a的值:
int
5、内联函数 普通的函数调用中,被调函数如果被主调函数多次调用,那么就要多次的压栈和出栈,这就造成了计算开销的极大增加【1】。如果把被调函数的代码嵌入到主调函数的调用处,就可以减少这种计算开销(自己目前是这么理解的)。内联inline必须是在函数定义时使用,而不是在函数声明时使用。同时内联函数应该用于简单运算,而不是复杂的代码。内联函数的定义方式如下:
inline 类型声明 函数名(类型声明 参数名)下面是使用内联函数计算平方的例子:
inline
6、带有默认形参数值的函数 这一点和python中规则是一致的,即某个位置的形参如果有默认值,那么它右边的形参必须都有默认值。
如果在函数定义时给出了形参默认值,那么在函数声明时必须给出相同的默认值。下面的例子采用带有默认值的形参来计算平方值:
int
7、函数重载 函数重载是指,
对于“跑”这个动作,鸭子或者长得像是鸭子的动物都有,所以没必要采用多个名字来定义跑,比如“duck_run()”和"xxx_run()"等,C++通过重载是指可以仅仅定义多个名为"run()"的函数,这些同名函数只要形参不同(个数或者类型不同):
int
按照相关资料【2】中的叙述,C++函数重载中“返回类型”是不能作为区分不同函数的,因为函数调用时仅仅给出“参数个数和参数类型”,并没有给出“返回值类型”,所以编译器不知道应该如何选择函数。此外,重载时应该对各个函数都在主调函数中进行声明:
int
参考: 【1】https://zhuanlan.zhihu.com/p/89554322
【2】https://www.zhihu.com/question/21455159/answer/59874307