《c++语言导学》——1.4 函数

1.4 函数

如果我们打算在C++程序中完成某些任务,最好的方式就是调用函数。要想准确描述某项操作的细节,把它定义成函数是最优选择。需要注意的是:函数必须先声明后使用。
一条函数声明语句需要完成三项任务:指定函数的名字、函数的返回值类型(如果有的话)以及要想调用该函数必须提供的实参数量和类型。例如:

https://yqfile.alicdn.com/7f25c9d853b741fbce9269a894177da354871aea.png
" >

在函数声明语句中,返回值类型位于函数的名字之前,实参类型则位于函数的名字之后,并且用括号括起来。
实参传递的过程与拷贝初始化非常类似,编译器负责检查实参的类型,并且在必要的时候执行隐式实参类型转换(见1.5节)。例如:

对于发生在编译过程中的类型检查和转换,程序员需要给予足够的重视。
我们可以在函数的声明语句中写上实参的名字,这有助于程序的读者理解该函数的含义。但事实上,除非该声明同时也是函数的定义,否则实参的名字不会影响编译过程。例如:

返回值类型和实参类型属于函数类型的一部分。对于类成员函数(见2.3节,4.2.1节)来说,类名字本身也是函数类型的一部分。例如:

每个程序员都希望自己编写的代码易于理解,因为易于理解是提高代码可维护性的第一步。而要使得整个程序易于理解,首先要把复杂的计算任务分解到易于理解的若干个模块中(以函数和类的形式),并给这些模块起个通俗易懂的名字。函数组成了计算的基本词汇表,正如类型(包括内置类型和用户自定义类型)组成了数据的基本词汇表。C++标准算法(如find、sort和iota)是程序函数化的良好开端(见第10章),接下来我们就能用这些表示通用任务或者特殊任务的函数组合出更复杂的计算模块了。
代码中错误的数量通常与代码的规模和复杂程度密切相关,多使用一些更短小的函数有助于降低代码的规模和复杂度。举例来说,通过把一项专门的任务定义成函数,我们就能在别的代码段内节省出空间,从而使程序的逻辑结构更加清晰易懂;同时我们也就不得不为这些任务命名并明确它们的依赖关系。
如果程序中存在名字相同但实参类型不同的函数,则编译器负责为每次调用选择匹配度最高的函数。例如:

https://yqfile.alicdn.com/e304e63da27a6d7a55b5c2f77ce3c722ad51b10b.png
" >

如果存在两个可供选择的函数并且它们难分优劣,则编译器认为此次调用具有二义性并报错。例如:

https://yqfile.alicdn.com/ad01b131355ce7ce9fedd091b1fe05ea844d4bb1.png" >

上述关于同名函数的规定就是我们所熟知的函数重载,函数重载是泛型编程(见5.4节)的一个关键问题。如果函数被重载了,则所有重载的同名函数应该实现相同的语义内容。print()函数符合这一规定,每个print()函数都会把它的实参打印出来。

时间: 2024-09-20 03:05:16

《c++语言导学》——1.4 函数的相关文章

《Java语言导学(原书第6版)》一1.3 “Hello World!”实例程序剖析

1.3 "Hello World!"实例程序剖析 前面已经介绍了"Hello World!"程序及其编译和运行过程,本节介绍其工作原理.再次给出"Hello World!"程序的代码如下: "Hello World!"程序包含三个基本组件:源码注释.HelloWorldApp类定义和main方法.下述说明有助于初步理解这些代码,深入理解还需等到读完本书之后. 1.3.1 源码注释 下面的黑体字指出了"Hello Wo

《c++语言导学》——3.4 错误处理

3.4 错误处理 错误处理是一个略显繁杂的主题,它的内容和影响都远远超越了语言特性的层面,而应归结为程序设计技术和工具的范畴.不过C++还是提供了一些有益的功能,其中最主要的一个工具就是类型系统本身.在构建应用程序时,通常的做法不是仅仅依靠内置类型(如char.int和double)和语句(如if.while和for),而是建立更多适合应用的新类型(如string.map和regex)和算法(如sort().find_if()和draw_all()).这些高级成分简化了程序设计,减少了产生错误的

《c++语言导学》——2.3 类

2.3 类 上面这种将数据与其操作分离的做法有其优势,比如我们可以非常自由地使用它的数据部分.不过对于用户自定义类型来说,为了将其所有属性捏合在一起,形成一个"真正的类型",在其表示形式和操作之间建立紧密的联系还是很有必要的.特别是,我们常常希望自定义的类型易于使用和修改,希望数据具有一致性,并且希望表示形式最好对用户是不可见的.此时,最理想的做法是把类型的接口(所有代码都可使用的部分)与其实现(对外部不可访问的数据具有访问权限)分离开来.在C++中,实现上述目的的语言机制称为类(cl

《Java语言导学(原书第6版)》一导读

前 言 自2010年年初Oracle公司收购Sun公司以来,Java语言迎来激动人心的时代.正如Java Community Process计划的活动所印证的,Java语言将不断发展.本书基于Java SE 8(Java Platform Standard Edition 8)并引用其API. 相比本书第5版(针对的是Java版本7),第6版有一些新特点: Lambda表达式使得功能可作为方法参数使用,代码作为数据使用.Lambda表达式描述单个方法接口(也称为功能接口)的实例会更简洁.4.4.

《Java语言导学(原书第6版)》一3.2 运算符

3.2 运算符 学习了如何声明和初始化变量之后,下面看看如何利用这些变量来做点事情.学习Java程序语言的运算符是个很好的切入点.运算符是一类特殊的符号,它们执行1个.2个或3个运算对象上的特定操作,然后返回结果. 研究Java程序语言的运算符时,先了解这些运算符的优先级可能会有帮助.表3-2根据优先级顺序列出了所有的运算符.越靠近表的顶端,运算符的优先级越高.优先级较高的运算符先计算,相对较低的后计算.同一行的运算符优先级相等.当表达式中出现优先级相等的运算符时,计算规则如下:赋值运算符从右到

《Java语言导学(原书第6版)》一一3.2 运算符

3.2 运算符 学习了如何声明和初始化变量之后,下面看看如何利用这些变量来做点事情.学习Java程序语言的运算符是个很好的切入点.运算符是一类特殊的符号,它们执行1个.2个或3个运算对象上的特定操作,然后返回结果. 研究Java程序语言的运算符时,先了解这些运算符的优先级可能会有帮助.表3-2根据优先级顺序列出了所有的运算符.越靠近表的顶端,运算符的优先级越高.优先级较高的运算符先计算,相对较低的后计算.同一行的运算符优先级相等.当表达式中出现优先级相等的运算符时,计算规则如下:赋值运算符从右到

《Java语言导学(原书第6版)》一一1.3 “Hello World!”实例程

1.3 "Hello World!"实例程 序剖析 前面已经介绍了"Hello World!"程序及其编译和运行过程,本节介绍其工作原理.再次给出"Hello World!"程序的代码如下: "Hello World!"程序包含三个基本组件:源码注释.HelloWorldApp类定义和main方法.下述说明有助于初步理解这些代码,深入理解还需等到读完本书之后.1.3.1 源码注释 下面的黑体字指出了"Hello Wo

《c++语言导学》—— 导读

前言 现在的C++仿佛进化成了一种新的语言.与C++98相比,C++11更易于我们清晰.简洁.直观地表达思想.而且编译器可以更好地检查程序中的错误,程序的运行速度也提高了. 就像其他任何一种现代编程语言一样,C++的规模庞大且提供的库异常丰富,值得程序员认真学习以便高效地利用.这本小册子的目的是让有经验的程序员快速了解现代C++语言,因此它几乎介绍了C++的全部核心功能和重要的标准库组件.读者花费几个小时就能读完本书,但是想必所有人都清楚,要想写出漂亮的C++程序绝非一日之功.好在本书的目的并非

《Java语言导学(原书第6版)》一一2.1 对象

2.1 对象对象是理解面向对象技术的关键概念.生活中有很多对象的例子,如狗.桌子.电视机.自行车等.生活中的对象都有两个共同的属性:状态和行为.狗有名字.颜色.品种等状态,以及犬吠.抓东西.摇尾巴等行为.自行车有当前档位.当前脚踏频率.当前速度等状态和换档.变换踏板频率.刹车等行为.根据面向对象编程的思路来确定生活中对象的状态和行为是很好的方法.前面已经介绍了生活中的几个对象.对每个对象,都有两个问题:"它处于什么状态"和"它会发生什么行为".仔细观察并写下这些状态