2.4 函数
C++函数分两种:有返回值的和没有返回值的。
2.4.1 使用有返回值的函数
有返回值的函数将生成一个值,而这个值可赋值给变量或在其他表达式中使用。
圆括号中的值是发送给函数的信息,这被称为传递给函数。以这种方式发送给函数的值叫作参数。
函数原型之于函数就像变量声明之于变量----指出涉及的类型。
double sqrt(double); 第一个double意味着sqrt()将返回一个double值。括号中的double意味着sqrt()需要一个double参数。
在程序中使用sqrt()时,也必须提供原型。可以用两种方法来实现:
- 在源代码文件中输入函数原型;
- 包含头文件cmath(老系统为math.h),其中定义了原型。
原型只描述函数接口,它描述的是发送给函数的信息和返回的信息。而定义中包含了函数的代码,如计算平方根的代码。
使用库函数:
C++库函数存储在库文件中。
2.4.2 函数变体
int rand(void); 关键字void明确指出,该函数不接收任何参数。如果省略void,让括号为空,则C++将其解释为一个不接受任何参数的隐式声明。
void bucks(double);在原型中使用关键字void来指定返回类型,以指出函数没有返回值。
有返回值的函数被称为函数(function);没有返回值的函数被称为过程(procedure)或子程序(subroutine)。
2.4.3 用户定义的函数
1.函数格式
首先,有一个函数头;然后是花括号中的函数体。
2.函数头
void simon(int n);开头的void表明simon()没有返回值,因此调用simon()不会生成可在main()中将其赋值给变量的数字。
int main();开头int表明,main()返回一个整数;空括号表明,main()没有参数。对于有返回值的函数,使用关键字return来提供返回值,并结束函数。
关键字
关键字都是C++专用的,不能他用,不能将return用作变量名
2.4.4 用户定义的有返回值的函数
函数原型描述了函数接口,即函数如何与程序的其他部分交互。参数列表指出了何种信息将被传递给函数,函数类型指出了返回值的类型。
在函数stonetobl()短小、简单,但包含了全部的函数特性:
- 有函数头和函数体;
- 接受一个参数;
- 返回一个值;
- 需要一个原型。
2.4.5 在多函数程序中使用using编译指令
让程序能够访问名称空间std的方法有多种,下面是其中的4种:
- 将using namespace std;放在函数定义之前,让文件中所有的函数都能够使用名称空间std中所有的元素。
- 将using namespace std;放在特定的函数定义中,让该函数能够使用名称空间std中的所有元素。
- 在特定的函数中使用类似using std::cout;这样的编译指令,而不是using namespace std;让该函数能够使用指定的元素,如cout。
- 完全不使用编译指令using,而在需要使用名称空间std中的元素时,使用前缀std::。
命名约定
函数命名,例子如下:
Myfunction()
myfunction()
myFunction()
my_function()
my_funct()
2.5 总结
C++程序由一个或多个被称为函数的模块组成。程序从main()函数(全部小写)开始执行,因此该函数必不可少。函数由函数头和函数体组成。
函数头指出函数的返回值(如果有的话)的类型和函数期望通过参数传递给它的信息的类型。函数体由一系列位于花括号({})中的C++语句组成。
由多种类型的C++语句,包括下述6种。
- 声明语句:定义函数中使用的变量的名称和类型。
- 赋值语句:使用赋值运算符(=)给变量赋值。
- 消息语句:将消息发送给对象,激发某种行动。
- 函数调用:执行函数。被调用的函数执行完毕后,程序返回到函数调用语句后面的语句。
- 函数原型:声明函数的返回类型、函数接受的参数数量和类型。
- 返回语句:将一个值从被调用的函数那里返回到调用函数中。
类是用户定义的类型规范,它详细描述了如何表示信息以及可对数据执行的操作。对象是根据类规范创建的实体,就像简单变量是根据数据类型描述创建的实体一样。
C++提供了两个用于处理输入和输出的预定义对象(cin和cout),它们是istreasm和ostream类的实例,这两个类是iostream文件中定义的。为ostream类定义的插入运算符(<<)使得将数据插入输出流成为可能;
为istream类定义的运算符(>>)能够从输入流中抽取信息。cin和cout都是智能对象,能够根据程序上下文自动将信息从一种形式转换为另一中形式。
C++可以使用大量的C库函数。要使用库函数,应当包含提供函数原型的头文件。
2.6 复习题
1.C++程序的模块叫什么?
答:它们叫作函数。
2.下面的预处理器编译指令是做什么用的? #include <iostream>
答:这将导致在最终的编译之前,使用iostream文件的内容替换该编译指令。
3.下面的语句是做什么用的?using namespace std;
答:它使得程序可以使用std名称空间中的定义。
4.什么语句可以用来打印短语“Hello,world”,然后开始新的一行?
答:cout << “Hello,world” << endl;
5.什么语句可以用来创建名为cheeses的整数变量?
答:int cheeses
6.什么语句可以用来将值32赋给变量cheeses?
答:cheesses = 32;
7.什么语句可以用来将键盘输入的值读入变量cheesses中?
答:cin >> cheeses;
8.什么语句可以用来打印“We have X varieties of cheesse,”,其中X为变量cheeses的当前值。
答:cout << "We have" << cheeses << "varieties of cheesse," << endl;
9.下面的函数原型指出了关于函数的那些信息?
int froop(double t);
答:调用函数froop()时,应提供一个参数,该参数的类型为double,而该函数将返回一个int值。
void rattle(int n);
答:函数rattle()接受一个int参数且没有返回值。
int prune(void);
答:函数prune()不接受任何参数且返回一个int值。
10.定义函数时,在什么情况下不必使用关键字return?
答:当函数的返回类型为void时,不用在函数中使用return。然而,如果不提供返回值,则可以使用它,return;
11.假设您编写的main()函数包含如下代码:
cout << "Please enter your PIN: ";
而编译器指出cout是一个未知标识符。导致这种问题的原因很可能是什么?指出3种修复这种问题的方法。
答:①加using namespace std;②cout前面加std::;③cout前面加using std::;