天天看点

inline函数返回值_C++日志(六)函数

inline函数返回值_C++日志(六)函数
1、函数的定义

函数在使用之前需要预先定义,定义函数的语法为:

类型声明 函数名(类型声明 形式参数) {语句;}

其中类型声明决定了这个函数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