参考:《C++ Primer》
6 函数
关键:函数重载,函数指针
6.1 函数基础
调用函数
调用函数中return语句的作用?
与函数调用一样,return语句也完成两项工作:
返回return语句中的值,如果有的话;
将控制权从被调函数转移回主调函数;
形参与实参
形参与实参的定义与区别?
性质:
实参是形参的初始值。第几个实参初始化第几个形参;
实参与形参之间存在对应关系,但是并没有规定实参的求值顺序;
实参的类型必须与对应的形参类型匹配;(包括个数,因此形参一定会被初始化)
即使类型稍微不同,也需要具备能够转换的功能;(比如形参int对于实参3.14也成立)
形参列表可以为空,但不可以被省略;(可使用void表示函数无形参)
每个形参的类型都要被声明,且不可同名;
函数返回类型
函数返回类型有哪些?
返回类型void表示函数不返回任何值;
返回类型不能是数组或函数类型,但可以是指向数组或函数的指针;
局部对象
局部变量的定义?
形参和函数体内部定义的变量
自动对象
自动对象的定义?
只存在于块执行期间的对象称为自动对象;
当块的执行结束后,块中创建的自动对象的值变为undefined;
自动对象的例子?
形参是一种自动对象;
局部变量于自动对象的关系?
对于局部变量对应的自动对象来说,分2个情况:
变量定义本书含有初始值,就用该初始值来初始化;
变量定义本书不含初始值,执行默认初始化;(内置类型的未初始化局部变量将参数未定义的值的)
局部静态对象
为什么需要局部静态对象,有何意义?如何获得?
延长局部变量的生命周期,甚至贯穿函数调用及之后的时间;
将局部变量定义为static类型从而获得局部静态对象;
在程序的执行路径第一次经过对象定义语句时初始化,直到程序终止才被销毁,在此期间函数结束执行也毫无影响;
内置类型的局部静态变量初始化为0;
形参、局部变量、局部静态变量的区别,并举例具体说明?
形参和定义在函数体内部的变量统称为局部变量,他们对于函数而言是局部的,仅在函数的作用域内可见;
函数体内的局部变量分成:普通局部变量 & 静态局部变量
形参 & 普通局部变量:当函数的控制路径经过变量定义语句时创建该对象,到达对应所在块末尾时销毁;
只存在于块执行期间的对象为自动对象;
形参:形参是一种自动对象;
普通变量对应的自动对象:定义该变量的语句出创建自动对象,如定义语句提供初始值,则用起初始化;否则,执行默认初始化;块结束后,变量失效;
局部静态变量:生命周期贯穿函数调用及之后的时间;
形参:val1与val2;普通局部变量:result;局部静态变量:iCnt;
double myADD(double val1, double val2) { double result = val1 + val2; static unsigned iCnt = 0; ++iCnt; cout << "该函数已经累计执行了" << iCnt << "次" << endl; return result; } int main() { double num1, num2; cout < "请输入两个数:"; while (cin >> num1 >> num2) { cout << num1 << "与" << num2 << "的求和结果是" << myADD(num1, num2) << endl; } return 0; }
函数声明
函数声明与定义的关系?
函数只能定义一次,但可以声明多次;(不过存在例外)
若一个函数永远不会被用到,则可以只有声明没有定义;
唯一区别:函数声明无须函数体,用一个分号替代即可;(因此也无须形参的名字,虽可省略,但写上可帮助理解函数功能)
分离式编译
为什么需要分离式编译?
把程序分割到几个文件中去,每个文件独立编译,降低程序的复杂度;
如何编译和链接多个源文件?
已知位置信息:
fact函数:fact.cc文件中;
函数声明:chapter6.h头文件中;
main函数:factMain.cc文件中;
目标:在main函数中调用fact函数
要生成可执行文件exe,必须告诉编译器代码在哪儿:
$ CC factMain.cc fact.cc # generate factMain.exe or a.out $ CC factMain.cc fact.cc -o main # generate main or main.exeCC是编译器的名字;
$是系统提示符;
#后面是命令行下的注释语句;
接下来运行可执行文件,就会执行定义的main函数;