C++要求,所有函数必须先声明,后使用
调用其他函数的函数称为主调函数,被其他函数调用的函数称为被调函数。
形参的作用是实现主调函数与被调函数之间的联系。
main函数也可以有参数,称为命令行参数,由操作系统启动程序时初始化。
return可以结束当前函数的执行,但是函数的结束为汇编语言ret
如果希望在定义一个函数前调用它,则需要在调用函数之前添加该函数的函数原型声明。
声明函数时,形参名可以省略(不推荐)。
递归调用:函数可以直接或间接地调用自身,称为递归调用。(只有有限的递归调用才有意义)
函数在未被调用时,函数的形参不占内存空间,也没有实际的值。
形参和实参结合的方式有两种:值传递和引用传递。
值传递:函数调用时,给形参分配内存空间,使用实参初始化形参,之后形参实参脱离联系。
引用传递:引用是一种特殊类型的变量,是其他变量的别名。
声明一个引用时,必须对它进行初始化,使它指向一个已经存在的对象。且一旦初始化后,就不能指向其他对象。
内联函数不是在调用时发生控制转移,而是在编译时将函数体潜入每一个调用处。节省参数传递,控制转移等开销,适用于规模小但是调用频繁的函数。如果将复杂函数定义为内联函数,会造成代码膨胀,增大开销。所以现代编译器多会自主判断是否将一个函数转换为内联函数。还存在一些函数无法作为内联函数,比如自身递归函数不可作为内联函数。
inline 类型说明符 函数名(参数列表){
语句序列
}
函数在定义时可以预先声明默认的形参值。默认形参必须在形参列表的后面。
在相同作用域内,不允许在同一函数的多个声明中对同一个参数的默认值重复定义,即使定义的值相同也不可以。
两个以上的函数,具有相同函数名,但是形参个数,或类型,或形参次序不同,编译器根据实参和形参的类型和个数的最佳匹配,自动确定调用哪一个函数,这就是函数重载。
形参和局部变量采用栈来储存。
3-1 C++中的函数是什么?什么叫主调函数,什么叫被调函数,二者之间有什么关系?如何调用一个函数?
解:
一个较为复杂的系统往往需要划分为若干子系统,高级语言中的子程序就是用来实现这种模块划分的。C和C++语言中的子程序就体现为函数。调用其它函数的函数被称为主调函数,被其它函数调用的函数称为被调函数。一个函数很可能既调用别的函数又被另外的函数调用,这样它可能在某一个调用与被调用关系中充当主调函数,而在另一个调用与被调用关系中充当被调函数。
调用函数之前先要声明函数原型。按如下形式声明:
类型标识符 被调函数名 (含类型说明的形参表);
声明了函数原型之后,便可以按如下形式调用子函数:
函数名(实参列表)
3-3 比较值调用和引用调用的相同点与不同点。
解:
值调用是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。这一过程是参数值的单向传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参发生了怎样的改变,都不会影响到实参。
引用调用将引用作为形参,在执行主调函数中的调用语句时,系统自动用实参来初始化形参。这样形参就成为实参的一个别名,对形参的任何操作也就直接作用于实参。
3-4 什么叫内联函数?它有哪些特点?
解:
定义时使用关键字 inline的函数叫做内联函数;
编译器在编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销;
内联函数体内不能有循环语句和switch语句;
内联函数的定义必须出现在内联函数第一次被调用之前;
对内联函数不能进行异常接口声明;
3-5 函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗?
解:
不必一致,所有的参数是根据位置和类型而不是名字来区分的。
3-6 重载函数时通过什么来区分?
解:
重载的函数的函数名是相同的,但它们的参数的个数和数据类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。
3-11 什么叫作嵌套调用?什么叫作递归调用?
解:
函数允许嵌套调用,如果函数1调用了函数2,函数2再调用函数3,便形成了函数的嵌套调用。
函数可以直接或间接地调用自身,称为递归调用。