第六章 函数
函数基础
- 实参与形参的区别 ,实参是调用函数时使用的参数,形参是函数定义时使用的参数,
- 形参列表可以为空,但不能省略
- 大多数类型都能用于函数的返回类型,void不返回任何值;且返回值不能是数组,但可以是指向数组的指针
- 局部对象分为自动对象和局部静态对象,自动对象只存在于块的执行过程中,局部静态对象第一次经过对象定义语句时初始化,到程序中止才销毁,不受块的约束。
传递参数
- 当形参是引用类型时,对应的实参被引用传递,当实参的值被拷贝给形参时,形参和实参时两个相互独立的对象,实参被值传递。
- 值传递时,函数对形参的操作不会影响实参,对指针参数也是同样的,不会改变实参指针存储的内容,形参和实参是两个不同的指针(但指向了同样的地址)。
- 引用传递时,对形参的操作实际上是对实参的操作,会改变主调函数的变量。
建议使用引用类型的形参替代指针,由于大型的容器在传值调用时需要拷贝,耗费的时间长,且有些容器根本就不支持拷贝的操作
如果函数无需改变引用形参的值,声明为常量引用 ,以防被修改掉值P189
bool isShroter(const string &a,const string &b)
{
return a.size() < b.size()
}
- 使用引用形参返回额外信息,如果想要返回多个量,可以在调用时传入存储该量的变量的引用
- const形参和实参,用实参初始化形参时会忽略形参的顶层const,也就是向一个const形参可以传常量或者非常量对象;底层const参数传递,必须具有相同的底层const类型,要么就是将非常量实参初始化底层const形参,但不能用底层const实参来初始化非常量形参。如果想在多个文件之间共享const对象,必须在变量定义之前添加extern关键字, Extern是声明外部变量,一般不对extern声明的变量赋值(因为会定义变量)变量只能被定义一次,但可以多次声明。
- 尽量使用常量引用,否则能传递给形参的实参类型会受到限制,如字符串字面量就无法传递给string &s类型的形参,并且调用该函数的其他函数在传递参数的时候也会有很大问题。
- 数组形参
这三种都是传递指向数组首地址的指针
- 管理数组的尺寸时,除了字符串里的’\0’标记,也可以显式传递大小,也可以将形参定义成数组的引用
void print(int (&arr)[10])
{
for(auto elem:arr)