6.1基础

实参是形参的初始值。
局部对象
名字有作用域,对象有生命周期。
名字的作用域是程序文本的部分,名字在其中可见。
对象的生命周期是程序执行过程中该对象存在的一段时间。
形参和函数体内部定义的变量统称为局部变量。它们对函数而言是“局部”的,仅在函数的作用域内课件,同时局部变量还会隐藏在外层作用域中同名的其他所有声明中。

函数声明
函数只能定义依次,但可以声明多次。函数声明无须函数体,用一个分好替代即可。因为函数的声明不包含函数体,所以也就不需要形参的名字。
函数的三要素(返回类型、函数名、形参类型)描述了函数的接口,函数声明也称为函数原型。
分离式编译
分离式编译允许我们把程序分割到几个文件中去,每个文件独立编译。
6.2参数传递
如果形参是引用类型,它将绑定到对应的实参中;否则将实参的值拷贝后赋给形参。(形参用&,即引用,函数使用的其实是实参,如有更改,实参更改)。形参是引用类型,称它对应的实参为引用传递,函数被传引用调用。引用形参是它对应的实参的别名。

指针形参

只是实参的指针指向的位置拷贝给形参,所以两者指向都是同一个对象。
建议使用引用类型的形参替代指针。
使用引用避免拷贝
当某种类型不支持拷贝操作时,就只能用引用形参访问对象。
使用引用形参还能返回额外的信息
Return只能返回一个值,引用形参更改了实参的值,其实是返回多个结果。
Const形参和实参
当形参有顶层const是,传给它的对象常量或者非常量对象都是可以的。
尽量使用常量引用,不能把const对象、字面值或者需要类型转换的对象传递给普通的引用形参。
数组形参
数组的特殊性质:
(1)不允许拷贝数组以及使用数组时(通常)会将其转换成指针,所以不能值传递。
(2)因为数组会转换成指针,所以当我们为函数传递一个数组时,实际上传递的是指向数组首元素的指针。


管理数组长度的三种技术
(1)使用标记指定数组长度,要求数组本身包含一个结束标记,如字符串的空字符。
(2)使用标准库规范,传递数组首元素和尾后元素的指针。(begin,end函数)
(3)显示传递一个数组的大小
只有当函数确实要改变元素值的时候才把形参定义成指向非常量的指针。
实参要与形参定义的数组维度一致。
含有可变形参的函数

使用initializer_list的条件是函数的实参数量未知但是全部实参类型相同。其内部元素永远是常量。

6.3返回类型和return语句

不要返回局部对象的引用和指针。
可以返回花括号包围值的列表。
返回数组指针
返回数组和指针比较麻烦,可以使用类型别名。

返回数组,要牢记被定义名字后面数组的维度。
使用尾置返回类型,

使用decltype

6.4函数重载
一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来;
函数匹配是指一个过程,在这个过程中我们把函数调用与一组重载函数中的某一个关联起来,函数匹配也叫做重载确定。


6.5特色用途语言特性
6.5.1默认实参
这样一种形参,在函数的很多次调用中他们都被赋予一个相同的值,此时,称这个反复出现的值为默认实参。
给定的作用域中的一个形参只能赋予一次默认实参。函数的后续声明只能为之前那些没有默认值的形参添加默认实参,而且该形参右侧的所以形参必须都有默认值。
6.5.2内联函数和constexpr
内联函数加上inline可以避免额外花销。
Constexpr函数能用于常量表达式,函数的返回类型及所有形参的类型都得是字面值类型,而且函数体中必须有且只有一条return语句:

6.6函数匹配

最佳匹配:实参类型与形参类型越来越近,它们匹配的越好。

所有的算术类型转换的级别都一样。

6.7函数指针
不能定义函数类型的形参,但是形参可以是指向函数的指针。也可以返回指向函数类型的指针。

��C0����
网友评论