C++函数分两种,有返回值的和没有返回值的。在标准C++函数库中找到这两类函数的例子,也可以自己创建这、两种类型的函数
使用返回值的函数:
- 有返回的值的函数将生成一个值,而这个值可赋给变量或或在其他表达式中使用
-
在使用函数之前,C ++编译器必须知道函数的参数类型和返回值类型
- 注意:C++程序应当为程序中使用的每个函数提供原型
-
函数原型之余函数就像变量声明之于变量——指出涉及的类型
-
例子:
-
double sqrt(double);
-
第一个 double 意味着 sqrt() 将返回一个 double 值,括号中的 double 意味着 sqrt() 需要一个 double 参数。因此该原型对 sqrt() 的描述和下面代码中使用的函数相同
double x; x = sqrt(6.25);
注意:原型结尾的分号表明它是一条语句,这使得它是一个函数,而不是函数头。如果省略分号,编译器将吧这行代码解释为一个函数头,并要求接着提供定义函数的函数体
-
-
在程序中使用 sqrt()时,也必须提供原型,可以由以下两种方面实现:
- 在源代码文件中输入函数原型
-
包含头文件 cmath,其中定义了函数原型
- 第二种方法更好,因为头文件更有可能使原型正确'
- 不要混淆函数原型与函数定义,可以看出原型只描述函数接口,而定义中包含了函数的代码;库文件中包含了函数班的编译代码,而头文件中则包含了原型
-
应在首次使用函数之前提供其原型
-
下面的程序演示了库函数 sqrt()的用法,它通过包含cmth文件来提供函数的原型
//使用C++库函数中的sqrt()函数 #include <iostream> #include <cmath> using namespace std;
int main() { double area; cout << "请输入一个数,我将为您算出这个数的开平方" << endl; cin >> area; cin.get(); double side; side = sqrt(area); cout << "这个数的开平方为:" << side << endl << "这是一个多么神奇的事情" << endl; cout << "谢谢使用,再见!" << endl;
cin.get(); return 0; }程序输出:
请输入一个数,我将为您算出这个数的开平方
36
这个数的开平方为:6
这是一个多么神奇的事情
谢谢使用,再见!
-
-
函数变体:
-
有些函数需要多项信息,这些函数使用多个参数,参数间用逗号分开
-
例如:
-
double pow(double,double) answer = pow(5.0,8.0)
-
-
-
另外一些函数不接受任何参数:
-
例如:
-
int rand(void)
- 关键字void明确表示,该函数不接受任何参数,如果省略void,在C++中将其解释为一个不接受任何参数的隐式说明,可以这样使用该函数:
-
int rand()
-
-
-
还有一些函数没有返回值
-
例如:
-
void bucks(double);
- 由于他不返回值,因此不能将该函数调用放在赋值语句表达式,或没有返回值的
-
-
- 有些语言中没有返回值的函数被称为函数,没有返回值的函数称为过程或子程序;但C++与C一样,这两种变体都被称为函数
用户定义的函数
- 标准C库提供了140多个预定义的函数。如果其中的函数能满足要求,则应使用它们;但当标准库不满足用户需求时,就需要编写自己的函数
- 对于库函数,在使用之前必须提供其原型,通常把原型放到main()之前。但现在必须提供新函数的源代码,最简单的方法将代码放到mian()的后面
-
程序示例:
//定义自己的函数 #include <iostream> using namespace std; void simon(int); int main() { simon(3); cout << "pick an integer: "; int count; cin >> count; cin.get(); simon(count); cout << "Done!" << endl;
cin.get(); return 0; } void simon(int n) { //此函数打印一个用户输入的数字 cout << "Simon says touch your toes " << n << " times.<< endl; }程序输出:
Simon says touch your toes 3 times.
pick an integer: 32
Simon says touch your toes 32 times.
Done!
- main()函数两次调用simon()函数,一次的参数为3,另一次的参数为变量count,存储着用户输入的数字。
-
函数格式:
- simon()函数的定义与main()的定义采用的格式相同,首先是函数头,然后是花括号的函数体
- 注意:C++不允许将函数定义嵌套在另一个函数定义中,每个函数定义都是独立的,所有函数的创建都是平能等的
-
函数头:
- void simon(int);
- 开头的void表示simon()函数没有返回值,由于simon()没有返回值,所以不能这样使用它:simple = simon(3);
- 括号中的int n表示,使用simon()函数,应提供一个Int参数;n是新的变量,函数调用时传递的值将被赋给它。
- main()的返回值并不是返回给程序的其他部分,而是返回给操作系统
-
关键字:
- 关键字是计算机语言的词汇。
- 本章使用了4个关键字:int、void、return、和double,由于这些关键字都是C++专用的,因此不能用作他用
用户定义的有返回值的函数:
-
程序示例:
//把石头换成磅 #include <iostream> int stonetolb(int);
int main() { using namespace std; int stone; cout << "Enter the weight in stone :"; cin >> stone; cin.get(); int pounds = stonetolb(stone); cout << stone << " stone = "; cout << pounds << " pounds." << endl; cin.get(); return 0; } int stonetolb(int sts) { //返回一个数值 return 14 * sts; }程序输出:
Enter the weight in stone :3
3 stone = 42 pounds.
-
程序含义:
- 在main()中,程序使用cin来给整型变量stone提供一个值,这个值被作为参数传递给stonetolb()函数。
- stonetolb()用关键字return将14*sts返回给main();这里使用较为复杂的表大式,避免了创建一个新的变量,然后将它返回。
-
这两个返回的结果相同,但第二个版本更容易理解和修改,因为他将计算和返回给分开了
int aunt = stonetolb(20); int ants = aunt + stonetolb(10); cout << "Ferdie weighs" << stonetolb(16) << " pounds." << endl;
- 在任何情况下程序都计算返回结果,然后在语句中使用这个值
- 这些例子表明,函数原型藐视了函数接口,即函数如何与程序的其他部分交互
-
函数stoletolb() 短小,简单,但包含了函数的全部特性:
- 有函数头和函数体
- 接受一个参数
- 返回一个值
- 需要一个原型
在多函数程序中使用using编译指令
-
在之前的程序中,每个函数都包含下面一条using 编译指令:
using namespace std;
这是因为每个函数都使用了cout,因此需要能够访问位于名称空间std中的cout定义;但在下面程序中可以采用另一种方法让两个函数访问名称空间std,即将编译指令放在函数外面,且位于两个函数的前面
//重新定义using指令 #include <iostream> using namespace std; void simon(int); int main() { simon(3); cout << "请输入你每天学习的时间: "; int count; cin >> count; cin.get(); simon(count); cout << "再见啦!" << endl; cin.get(); return 0; } void simon(int n) { cout << "我每天学习的时间为:" << n << "个小时。" << endl; }
程序输出:
我每天学习的时间为:3个小时。
请输入你每天学习的时间: 9
我每天学习的时间为:9个小时。
再见啦!
-
总之,让程序能够访问空间 std的方法有多种,下面是其中的4种:
- 将using namespace std;放在函数定义之前,让文件中所有的函数都能够使用名称空间std中所有的元素
- 将using namespace std;放在特定的函数定义中,让函数能够使用名称空间std中的所有元素
- 在特定的函数中使用类似using namespace::cout;这样的编译指令,而不是using namespace std;,让该函数能够使用指定的元素,如cout
-
完全不使用编译指令using,而是在需要使用名称空间std中的元素,使用前缀std::,如下所示:
-
std::cout << "I'm using cout and endl from teh std namespace" << std::endl;
-