[C++ Primer CH06] 第6章 函数(笔记)

来源:互联网 发布:java验证码识别算法 编辑:程序博客网 时间:2024/06/08 13:42

小结:

函数是命名了的计算单元,它对程序(哪怕是不大的程序)的结构化至关重要。每个函数都包含返回类型、名字、(可能为空的)形参列表以及函数体。函数体是一个块,当函数被调用的时候执行该块的内容。此时,传递给函数的实参类型必须与对应的形参类型相容。

在C++语言中,函数可以被重载:同一个名字可以用于定义多个函数,只要这些函数的形参数量或形参类型不同就行。根据调用时所使用的实参,编译器可以自动的选定被调用的函数。从一组重载函数中选取最佳函数的过程被称为函数匹配。


笔记:

我们建议变量在头文件中声明,在源文件中定义。与之类似,函数也应该在头文件中声明而在源文件中定义。


在C++语言中,建议使用引用类型的形参代替指针。


如果函数无须改变引用形参的值,最好将其声明为常量引用。


如何定义函数使得它能够既返回位置也返回出现次数呢?一种方法是定义一个新的数据类型,让它包含位置和数量两个成员。还有另一种更简单的方法,我们可以给函数传入一个额外的引用实参,令其保存字符出现的次数。


将多维数组传递给函数的时,我们处理的时数组的数组,所以首元素本身就是一个数组,指针就是一个指向数组的指针。


为了编写能处理不同数量实参的函数,C++11新标准提供了两种主要的方法:1.如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型;2如果实参的类型不同,我们可以编写一种特殊的函数,也就是所谓的可变参数模板。


在含有return语句的循环后面应该也有一条return语句,如果没有的话该程序就是错误的。很多编译器都无法发现此类错误。


要想确保返回值安全,我们不妨提问:引用所引的是在函数之前已经存在的哪个对象?


在C++11新标准中还有一种可以简化上述func声明的方法,就是使用尾置返回类型(trailing return type)。任何函数的定义都能使用尾置返回,但是这种形式对于返回类型比较复杂的函数最有效,比如返回类型是数组的指针或者数组的引用。


尽管函数重载能在一定程度上减轻我们为函数起名字、记名字的负担,但是最好只重载那些确实非常相似的操作。有些情况下,给函数起不同的名字能使得程序更容易理解。


执行调试代码的方法用到两项预处理功能:assert和NDEBUG。


调用重载函数时应尽量避免强制类型转换。如果在实际应用中确实需要强制类型转换,则说明我们设计的形参集合不合理。


FAQ:

Q1:函数的形参为什么尽量使用常量引用?

A1:1、把函数不会改变的形参定义成(普通的)引用是一种比较常见的错误,这么做带给函数的调用者是一种误导,即函数可以修改它的实参的值。

2、使用引用而非常量引用也会极大地限制函数所能接受的实参类型。

Q2:函数匹配的步骤?

A2:1、函数匹配的第一步是选定本次调用对应的重载函数集,集合中的函数称为候选函数(condidate function)。候选函数具备两个特征;一是与被调用的函数同名,二是其声明在调用点可见。

2、考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数称为可行函数(viable function)。

3、是从可行函数中选择与本次调用最匹配的函数。


Q3:对象的生命周期?

A3:每个对象斗鱼相应的生命周期。块内定义的非静态对象的生命周期从它的定义开始,到定义所在的块末尾为止。程序启动后创建全局对象,程序控制流经过局部静态对象的定义时创建该局部静态对象;当main函数结束时销毁全局对象和局部静态对象。



原创粉丝点击