C++ primer笔记----函数

1、函数定义包括:返回类型、函数名、形参列表(0个或多个,用逗号隔开)以及函数体。 通过调用运算符(一对圆括号,作用于一个表达式,该表达式是函数或者指向函数的指针,圆括号之内是一个用逗号隔开的实参列表)来执行函数,用实参初始化函数的形参,调用表达式的类型就是函数的返回类型。

2、函数的调用完成两项工作:1)用实参初始化函数对应的形参;2)将控制权转移给被调用函数,此时主调函数的执行被暂时中断,被调函数开始执行。

3、执行函数的第一步是(隐式地)定义并初始化它的形参;当遇到return语句时函数结束执行过程,返回return语句中的值,将控制权从被调函数转移回主调函数。函数的返回值用于初始化调用表达式的结果。

4、编译器能以任意可行的顺序对实参求值,实参的类型必须与对应的形参类型匹配;实参数量应与形参数量一致,所以形参一定会被初始化

5、函数的形参列表可以为空,但不能省略。要定义一个不带形参的函数可以书写一个空的形参列表,也可以使用关键字void表示函数没有形参;即使两个形参的类型一样,也必须把两个类型都写出来;任意两个形参都不能同名,而且函数最外层作用域中的局部变量也不能使用与函数形参一样的名字。

6、返回类型是void表示函数不返回任何值;函数的返回类型不能是数组类型或函数类型,但可以是指向数组或函数的指针。

7、名字的作用域是程序文本的一部分,名字在其中可见;对象的生命周期是程序执行过程中该对象存在的一段时间;形参和函数体内定义的变量统称为局部变量只存在于块执行期间的对象称为自动对象,当块的执行结束后,块中创建的自动对象的值就变成未定义的了,形参就是一种自动对象。

8、如果需要令局部变量的生命周期贯穿函数调用及之后的时间,可以将局部变量定义成static类型;局部静态对象在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁。如果局部静态变量没有显式的初始值,它将执行值初始化,内置类型的局部静态变量初始化为0.

9、函数只能定义一次,但可以声明多次,也可以只有声明没有定义;函数声明无须函数体,用一个分号代替即可,也可以不写形参名字;函数的三要素(返回类型,函数名,形参类型)描述了函数的接口,说明了调用该函数所需的全部信息,函数声明也称作函数原型。如果把函数声明放在头文件中,就能确保同一函数的所有声明保持一致。

10、如果形参是引用类型,它将绑定到对应的实参上;否则,将实参的值拷贝后赋给形参;当形参是引用类型时,我们说它对应的实参被引用传递或者函数被传引用调用,引用形参是它对应的实参的别名。当实参的值被拷贝给形参时,形参和实参是两个相互独立的对象,我们说这样的实参被值传递或者函数被传值调用。指针的行为和其他非引用类型一样。

11、当某种类型不支持拷贝操作时,函数只能通过引用形参访问该类型的对象;当函数无须修改引用形参的值时最好使用常量引用。

12、当用实参初始化形参时会忽略掉顶层const;不能把const对象、字面值或需要类型转换的对象传递给普通的引用形参。

13、为函数传递一个数组时,实际上传递的是指向数组首元素的指针

14、管理指针形参有三种常用的技术:
1)使用标记指定数组长度:要求数组本身包含一个结束标记;
2)使用标准库规范:传递指向数组首元素和尾后元素的指针;
3)显示传递一个表示数组大小的形参;

14、C++允许将变量定义成数组的引用,但不能定义引用的数组;&arr两端的括号必不可少;
f(int &arr[10])//错误,将arr声明成了引用的数组;
f(int (&arr)[10])//正确,arr是具有10个整数的整形数组的引用;

15、调用含有默认实参的函数时,可以包含该实参,也可以忽略该实参;默认实参作为形参的初始值出现在形参列表中;一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。函数调用时实参按其位置解析,默认实参负责调补函数调用缺少的尾部实参(靠右侧位置),也就是只能省略尾部的实参。

16、在给定的作用域中一个形参只能被赋予一次默认实参,换句话说,函数的后续声明只能为之前那些没有默认值的形参添加默认实参,而且该形参右侧的所有形参必须都有默认值。局部变量不能作为默认实参。

17、return语句返回值的类型必须与函数的返回类型相同,或者能隐式地转换成函数的返回类型;在含有return语句的循环后面应该也有一条return语句;不要返回局部对象的引用或指针;如果函数返回指针、引用或类的对象,就能使用函数调用的结果访问结果对象的成员;

18、调用一个返回引用的函数得到左值,其他返回类型得到右值,能为返回类型时非常量引用的函数的结果赋值;C++11新标准规定,函数可以返回花括号包围的值的列表;

19、如果一个函数调用了它自身,不管这种调用是直接的还是间接的,都称该函数为递归函数;main函数不能调用它自己;

20、可以使用类型别名来返回数组指针或引用;返回数组指针的函数形式
type(*function(parameter_list))[dimension]
type表示元素的类型,dimension表示数组的大小;

21、尾置返回类型跟在形参列表后面并以一个->符号开头,为了表示函数真正的返回类型跟在形参列表之后,我们在本应该出现返回类型的地方放置一个auto;
eg:auto func(int i)->int(*)[10];

22、如果知道函数返回的指针将指向哪个数组,就可以使用decltype关键字声明返回类型;

23、内联函数可避免函数调用的开销;将函数指定为内联函数,通常就是将它在每个调用点上“内联地”展开;在函数的返回类型前加上关键字inline就可以将它声明成内联函数了;

24、constexpr函数是指能用于常量表达式的函数,函数的返回类型及所有形参的类型都得是字面值类型,而且函数体中必须有且只有一条return语句;constexpr函数被隐式地指定为内联函数;constexpr函数不一定返回常量表达式;内联函数和constexpr函数通常定义在头文件中。

25、如果同一作用域内的几个函数名字相同但形参列表不同,称之为重载函数。main函数不能重载;不允许两个函数除了返回类型外其他所有的要素都相同;一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来;如果形参是某种类型的指针或引用,则通过区分其指向的是常量对象还是非常量对象可以实现函数重载,此时的const是底层的;

26、定义了一组重载函数后,需要以合理的实参调用它们;函数匹配是指一个过程,在这个过程中把函数调用与一组重载函数中的某一个关联起来,函数匹配也叫做重载确定,编译器首先将调用的实参与重载集合中每一个函数的形参进行比较,然后根据比较的结果决定到底调用哪个函数。

27、在C++中,名字查找发生在类型检查之前;

28、当把函数名作为一个值使用时,该函数自动地转换成指针,也能直接使用指向函数的指针调用该函数,无须提前解引用指针;虽然不能定义函数类型的形参,但是形参可以是指向函数的指针,此时,形参看起来是函数类型,实际上是当成指针使用;可以直接把函数作为实参使用,此时它会自动转换成指针;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值