************************************************************
************************************************************
仅以此文献给我即将离开的母校
——东北大学
<script type="text/javascript" src="http://ads.adbrite.com/mb/text_group.php?sid=170596&col=3&br=1"></script>
仅以此文献给我即将离开的母校
——东北大学
<script type="text/javascript" src="http://ads.adbrite.com/mb/text_group.php?sid=170596&col=3&br=1"></script>
函数 (I)
|
我们可以通过使用函数来使我们的程序更加模块化,令我们得到
C++
模块化编成的所有潜在好处。
函数就是一组语句,当在程序中的某一点被调用时它们就被执行。下面就是它的格式:
type name ( parameter1, parameter2, ...) { statement }
其中:
-
- type是函数返回值的数据类型说明符(可选的)
- name是标识符通过它才可能调用一个函数。
- parameters (尽可能的多):每个形式参数(形参)由一个数据类型说明符后跟一个标识符构成,就像任何通常的变量声明那样(例如:int x)而且它们在函数中的角色就像是一个普通的局部变量。它们允许在函数被调用时向其传送实际参数(实参)。不同的参数用逗号隔开。
- statements是函数的主体。它是用一对花括号{ }括起来的一个语句块。
这里是你的第一个函数的例子:
// function example #include <iostream> using namespace std; int addition (int a, int b) { int r; r=a+b; return (r); } int main () { int z; z = addition (5,3); cout << "The result is " << z; return 0; } | The result is 8 |
为了检查这段代码,首先要记住在这个指南开始处说过的一些事情:一个
C++
程序总是从
main函数处开始执行。因此我们将从那里开始。
我们看到
main函数以定义一个int型的变量z开始。紧跟其后,我们看到调用了一个叫做addition的函数。请注意,我们将可以看到调用这个函数的结构和在上面几行代码中这个函数声明本身之间的相似性:
形参和实参之间有清晰的对应关系。在
main函数中我们调用了addition,并传递了两个值:5和3,这和为函数addition声明的形参int a和 int b相一致。
在
main中函数被调用的那一点,main失去了控制权并把控制权交给了函数addition。在这个调用中传递的两个实参值(5和3)被拷贝到那个函数中的局部变量int a和int b中。
函数
addition
定义了另一个局部变量
(int r)
,表达式
r=a+b
的意思是,它把
a
加
b
的结果符给了
r
。由于传给
a
和
b
的实际参数分别是
5
和
3
,所以结果是
8
。
下面这行代码:
return (r); |
结束了函数
addition,并把控制权交还给调用它的函数(在这里,main)。这时程序继续沿着他被调用addition而打断那点之后的程序继续运行。但是另外,因为在函数addition中的return语句指定了一个值:变量r的内容( return ( r ) ; ),它在那时拥有值8。这个值成为评估这个函数调用的值。
因此当一个值被函数返回时,函数所给出的值就是其当计算后被调用的结果,在这里变量
z将被置为addition(5,3)的返回值,这个值为8。用另一种方式来阐述函数返回值就是,你可以这样认为:调用一个函数(addition(5,3))被准确的被它的返回值(8)所替换。
在
main
中的下一行代码是:
cout << "The result is " << z; |
正如你可能已经预料的,在屏幕上输出了运算的结果。
变量的作用域
在一个函数或其它内置块内声明的变量的作用域只是它们自己的函数或它们自己的块,不能再它们之外使用。例如,在前面的例子中在函数
main
中不能直接使用变量
a, b
或
r
,
因为它们是函数
addition
的局部变量。同样,在函数
addition
中直接使用变量
z
也是不可能的,因为它是函数
main
的一个局部变量。
因此,局部变量的作用域被限制在它们被声明的块中。虽然如此,我们还是可以声明全局变量;它们实在代码的任何地方都可见的,在所有函数的里面和外面。为了为声明全局变量我只须简单的在所有的函数或块之外来声明变量;这意味着:在程序体中直接定义。
|
这是关于函数的另一个例子:
// function example #include <iostream> using namespace std; int subtraction (int a, int b) { int r; r=a-b; return (r); } int main () { int x=5, y=3, z; z = subtraction (7,2); cout << "The first result is " << z << '/n'; cout << "The second result is " << subtraction (7,2) << '/n'; cout << "The third result is " << subtraction (x,y) << '/n'; z= 4 + subtraction (x,y); cout << "The fourth result is " << z << '/n'; return 0; } | The first result is 5 The second result is 5 The third result is 2 The fourth result is 6 |
在这个例子中我们创建了一个叫做
subtraction的函数。这个函数作的唯一的事情就是把两个传入的参数作减法并把结果返回。
另外,如果我们查看
main函数我们将会看到我们调用了多次subtraction函数。我们用了一些不同的调用的方法,因此你看到了一个函数能被调用的不同的方法或时刻。
为了很好的明白这些例子,你必须再次思考调用一个函数就是用它将返回的值代替它本身。例如,在第一处
(
你可能已经明白了,以为他喝我们在上面的例子中使用了相同的参数
)
:
z = subtraction (7,2); cout << "The first result is " << z; |
如果我们用它的返回值
(
例如,
5)
来代替这个函数,我们有:
z = 5; cout << "The first result is " << z; |
同时也有:
cout << "The second result is " << subtraction (7,2); |
和前面的调用拥有相同的结果,但在这里我们把调用
subtraction直接作为了cout的参数。简单的把结果理解为我们把代码写成:
cout << "The second result is " << 5; |
因为
5
时
subtraction(7,2)得返回值。
在情况:
cout << "The third result is " << subtraction (x,y); |
我们在这里介绍的唯一的新东西就是
subtraction的参数是变量而不是常量。那是完全有效的。在这里传递给函数subtraction的值是x和y的值,也就是分别为5和3,得到的结果是2。
第四种也是基本相同的,简单的记住我们为了替换:
z = 4 + subtraction (x,y); |
我们可以写成
:
z = subtraction (x,y) + 4; |
它们拥有完全相同的结果。我交换了它们的位置,因此你能看到分号
(;)
是在整条语句的结尾。它并不需要紧跟在函数调用的后面。解释就是你在一次把设想一个函数能被它的返回值所代替:
z = 4 + 2; z = 2 + 4; |
没有类型的函数. void的用法.
如果你记得函数声明的语法:
type name ( argument1, argument2 ...) statement
你将看到声明是以一个类型开始的,那就是函数本身的类型
(
如:函数
return
语句将要返回的数据的类型
)
。但是如果你不想返回值呢?
想象你想制作一个函数仅仅想在屏幕上输出一条信息。我们不需要它返回任何值。在这种情况我们需要把
void类型指定给这个函数。这是一个特殊的说明符而不是没有类型。
// void function example #include <iostream> using namespace std; void printmessage () { cout << "I'm a function!"; } int main () { printmessage (); return 0; } | I'm a function! |
void也可以被在函数的参数列表中使用,用来明确的说明我们想要这个函数在调用时不需要任何实参。例如,函数printmessage可以被声明为:
void printmessage (void) { cout << "I'm a function!"; } |
但是在在参数列表中声明
void是可选的。在C++中,如果我们想要一个没有任何参数的函数,我们可以简单把他的参数列表留为空。
我们必须时刻记得是:调用一个函数的格式包括它的精确的名字和括在小括号中的参数。不存在参数并不意味着我们可以不写小括号。因为这个原因调用
printmessage的代码为:
printmessage (); |
小括号清晰的指出这是调用一个函数,而不是一个变量名或什么其它的
C++
语句。下面的调用是不正确的:
printmessage; |