第五章 学习总结

时间:2019-03-25
本文章向大家介绍第五章 学习总结,主要包括第五章 学习总结使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

第五章 函数
5.1
5.5.1函数定义
返回类型、函数名、参数列表和参数体构成了函数定义。
◎函数一般用一个名字表示,即函数名
◎函数的结果称为返回值,其类型称为函数返回类型
◎函数执行的动作在函数体中指定
◎函数定义的语法形式为:
返回类型 函数名(参数列表) { 函数体 }
如果函数没有任何参数,可以用空参数表或void参数表表示
调用执行函数的形式
函数名(实参列表);
函数调用时提供的实参个数和类型必须与函数定义中的形参个数和类型匹配
编译器进行参数类型检查,尝试自动类型转换
5.1.2函数声明
函数声明由函数返回类型、函数名和形参列表构成。
5.2参数传递
参数传递是指函数调用的实参来初始化函数形参存储区的过程。c++函数的参数传递方式有两种:传值和传引用。
◎传值,按值传递参数
当实参的值被复制给形参时,形参和实参是两个独立的对象,实参被称为按值传递,或传值调用函数
C++的默认参数传递方式
传指针:使用指针参数是传地址值
◎传引用,按引用传递参数
当形参是引用类型时,对应的实参被称为按引用传递,或者传引用调用函数
此时,引用形参绑定到实参,是实参对象的别名
◎按值传递参数的特点
简单直接,不会改变实参的内容,按值传递参数不适合的情况,大型的类对象或结构体变量作为实参时,在运行栈中分配空间并复制对象;时间和空间开销过大,必须要修改实参的值时,如交换两个变量的值
◎引用参数
当参数是引用时,函数接收的是实参的左值而不是值的副本,即形参是实参的引用,或者说是别名;函数操纵的形参是实参的别名,因而可以改变实参的值。
◎引用参数的用途
通过传递引用在函数内修改实参的值;向主调函数返回额外的结果;向函数传递大型的结构体变量或类对象;提高效率;将参数声明为const引用,避免在函数内部修改引用参数;类的拷贝构造函数和重载的运算符函数中。
使用引用参数传递大对象,可以避免大对象参数的复制,且可以访问实参对象
将参数声明为const引用,避免在函数内部修改引用参数
★对于内置类型的小对象,传值的方式更简单直接;如果想在函数内改变实参,使用传引用或传指针的方式;传指针的语法比引用复杂一些,但使用起来更清晰明确;对于类类型的对象,尽量使用引用传递参数,效率更高;使用const限定可以避免实参被修改。
★特殊要求
①数组和函数作参数时必须传指针
②拷贝构造函数的参数必须传引用
◎数组作参数时,将传递数组第一个元素的地址。数组的长度与参数声明无关,如果在函数内部要使用数组的长度,应该将它作为单独的一个参数。
◎被调函数内对参数数组的改变将应用到数组实参上;将形参数组声明为const表明不希望改变数组元素
用标准库中的string和vector对象作为函数的参数
string和vector是对象,不需要额外的参数指定长度
◎main函数的参数表
int main(int argc, char* argv[]){…}
main函数的参数表用于从命令行接收参数,处理命令行选项
argc是命令行参数的个数
字符串数组argv的每个元素依次保存接收的参数字符串
5.3返回类型和return语句
函数的执行结果由return语句返回
return语句结束当前正在执行的函数,将控制权返回给函数的调用者
return语句有两种形式:
return;
用在返回类型为void的函数中,不是必需的
return 表达式;
非void的函数必须返回一个与声明类型匹配的值,否则会引起编译错误
5.3.5尾置返回类型
语法形式为 auto 函数名(形参列表)->返回类型;
5.4函数重载
如果同一个作用域内的几个函数名字相同但形参列表不同,则它们是重载函数。
重载函数的参数表必须不同,或参数个数不同,或参数类型不同
返回类型不能区分两个重载函数,因为调用函数时可以忽略函数的返回值
◎const限定词对形参类型的影响
非指针和引用上的const限定词不能区分重载函数
const限定指针或引用时,可以实现函数重载
◎调用重载函数时三种可能的结果
①找到一个与实参最佳匹配的函数,编译器生成调用该函数的代码
②找不到任何一个函数与调用的实参匹配,编译器报告无匹配的错误消息
③找到多个与调用匹配的函数,而且匹配的程度一样好,此时发生二义性调用错误
5.5.3 constexpr函数
constexpr函数(常量表达式函数)是指能用于常量表达式的函数。
5.6函数指针
5.6.2使用函数指针
一旦定义了函数指针,在使用之前必须赋给它一个函数的地址。函数的地址可以由函数名字表示,或者使用显式的取地址运算符"&"。
5.7作用域和存储类别
生存期是指程序执行过程中对象存在的时间。
◎全局变量和全局函数
在全局作用域中可以定义函数和变量
在程序整个执行过程中都存在,可以在整个程序中使用
全局的内置类型变量,不指定初始值时被初始化为0值
全局变量和非inline 全局函数在程序中只能定义一次,在其他地方使用时需要声明
关键字extern 用来声明全局对象,可以在同一文件中或同一程序的不同文件中多次出现
◎在函数内和语句块内可以声明和定义局部对象
局部对象的作用域从其声明点开始,到函数结束处为止
在for 语句的初始化部分、if、while和switch 语句的条件部分声明的对象的作用域在该语句的控制范围内
局部对象默认为自动存储,可以通过存储类别关键字static 和register 对其进行修改
auto关键字表示自动存储的用法在C++11中已废止
◎声明为static的局部对象是静态存储的
static对象在控制流程第一次到达其定义点时被初始化,如果没有提供初始值,就被自动初始化为0值
静态对象的值在函数的多次调用之间保持有效,生存期会延续到整个程序结束,但它的作用域仍然是局部的
因此,需要在同一函数的两次调用之间保留某些数据时可以使用局部static对象
5.8 namespace
用户声明的每个namespace都是一个作用域
namespace只能在全局作用域或另一个namespace中定义
未命名namespace中的成员可以在其所属的文件内不加限定前缀使用,就像是具有文件作用域的名字
using 声明可以将namespace中的名字引入特定作用域
using std::cout;
using namespace std;
可以出现在全局作用域、namespace或局部作用域中
引入的名字从using声明开始到其所在作用域结束都可见