《C++语言程序设计》课程笔记
第三章
函数调用: 调用函数前要声明函数原型 类型标识符 被调用函数名(含类型说明的形参表)
调用形式:函数名(实参列表)
函数的嵌套调用: 函数调用过程中,用栈保存了当前现场和返回地址。
函数的递归调用: 函数直接或间接调用自身
函数的参数传递:
1.在函数被调用时才分配形参的存储单元
2.实参可以是常量、变量或表达式
3.实参类型必须与形参相符:如果不相符,编译器会先进行类型转换,判断是否合法
4.值传递可以是传递参数值,即单向传递
5.引用传递可以实现双向传递
6.常引用作参数可以保障实参数据的安全
引用类型:
1.引用(&)是标识符的别名
2.定义一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象
3.一旦一个引用被初始化后,就不能改为指向其它对象
4.引用可以作为形参
含有可变参数的函数:
· 如果所有实参类型相同,可以传递一个名为initializer_list的标准库类型
· 如果实参的类型不同,我们可以编写可变参数的模板(第9章)
· initializer_list:
1.是一种标准库类型,用于表示某种特定类型的值的数组,该类型定义在同名的头文件中
2.initializer_list<string> ls;//initializer_list的元素类型是string
3.其对象中的元素永远是常量值,我们无法改变initializer_list对象中元素的值
4.含有initializer_list形参的函数可以同时拥有其他形参
5.使用initializer_list编写一个错误信息输出函数,使其可以用于可变数量的形参
内联函数:
1.在调用简单函数的时候能够提高运行效率,由编译器实现
2.声明时使用关键字inline
3.编译时在调用处用函数体进行替换,节省了参数传递,控制转移等开销
4.内联函数体内不能有循环语句和switch语句
5.内联函数的定义必须出现在内联函数第一次被调用之前
6.对内联函数不能进行异常接口声明
constexpr函数:
1.constexpr修饰的函数,在其所有参数都是constexpr时一定返回constexpr
2.constexpr是一个常数表达式函数,可以用来初始化常量,承诺只要给的参数是常量表达式,那一定返回常量表达式
带默认参数值的函数:
1.可以预先设置默认的参数值,调用时如给出实参,则采用实参值,否则采用预先设置的默认参数值
2.有默认参数的形参必须列在形参列表的最右,即默认参数值的右边不能有无默认值的参数
3.调用时实参与形参的结合次序是从左向右
4.如果一个函数有原型声明,且原型声明在定义之前,则默认参数值应在函数原型声明中给出,函数定义中不能写默认参数值;
若只有函数的定义,或函数定义在前,则默认参数值可以在函数定义中给出。
函数重载: C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。
1.重载函数的形参必须不同:个数不同或者类型不同(编译器不以形参名或返回值来区分重载函数)
2.编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数
3.不要将不同功能的函数声明为重载函数,以免出现调用结果的误解和混淆。
判断两浮点数是否相同: abs(x-y)<1e-10
第三章总结
函数的定义与调用、参数传递
内联函数、带默认参数值的函数、函数重载
C++系统函数