打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
7.1 函数定义、提供原型和调用函数
  • 要使用C++函数,必须完成 3 个工作:① 提供函数定义;② 提供函数原型;③ 调用函数。

  • 库函数是已经定义和编译好的函数,同时可以使用标准库头文件提供其原型。如 strlen() 函数用来确定字符串的长度,头文件 cstring 包含了 strlen() 函数的原型,只需要包含头文件 #include <cstring> 即可。

  • calling.cpp程序演示了函数定义、提供原型和调用:

// calling.cpp -- defining, prototyping, and calling a function
#include <iostream>

// function prototype
void simple();

int main()
{
	using namespace std;
	
	cout << "main() will call the simple() function:\n";
	simple();	// function call
	cout << "main() is finished with the simple() function.\n";
	
	return 0;
}

// function definition
void simple()
{
	using namespace std;
	cout << "I'm but a simple function.\n";
}

编译输出:

main() will call the simple() function:
I'm but a simple function.
main() is finished with the simple() function.

① 执行simple()时,将暂停执行main()的代码; 等simple()执行完毕后,继续执行main()中的代码。

② 每个函数定义中,都使用了一条using编译指令,因为每个函数都使用了cout。

7.1.1 定义函数

  • 函数分为两类:

1. 没有返回值的函数被称为void函数。语法如下:

void functionName (parameterList)
{
  statements;
  return;	// optional
}

其中,parameterList指定了传递给函数的参数类型和数量;返回语句 return 0; 是可选的;

2. 有返回值的函数,将生成一个值,并将它返回给调用函数。语法如下:

typeName functionName (parameterList)
{
  statemets;
  return value;	// value is type cast to type typeName
}

① 函数的类型被声明为返回值的类型。

② 对于有返回值的函数,必须使用返回语句,以便将值返回给调用函数。值可以是常量、变量,也可以是表达式,只是其结果的类型必须为typeName类型或可以被转换为typeName。然后,函数将最终的值返回给调用函数。

③ C++对于返回值的类型有一定的限制:不能是数组,但可以是其他任何类型 — 整数、浮点数、指针,结构和对象。

通常,函数通过将返回值复制到指定的CPU寄存器或内存单元中将其返回。随后,调用程序将查看该内存单元。返回函数和调用函数必须就该内存单元中存储的数据类型达成一致。函数定义计算返回值,调用函数寻找返回值。

函数在执行返回语句后结束。如果函数包含多条返回语句,则函数在执行遇到的第一条返回语句后结束。

7.1.2 函数原型和函数调用

  • 函数原型经常隐藏在include文件中。

  • protos.cpp程序使用了函数cheer()和cube(),注意其中的函数原型:

#include <iostream>

void cheers(int);	// prototype: no return value
double cube(double x);	// prototype: return a double

int main()
{
	using namespace std;
	
	cheers(5);	// function call
	cout << "Give me a number: ";
	double side;
	cin >> side;
	double volume = cube(side);	// function call
	cout << "A " << side << "-foot cube has a volume of " 
         << volume << " cubic feet.\n";
	cheers(cube(2));	// prototype protection at work
	
	
	return 0;
}

void cheers(int n)
{
	using namespace std;
	for (int i = 0; i < n; i++)
		cout << "Cheers! ";
	cout << endl;
}

double cube(double x)
{
	return x * x * x; 
}

编译输出:

Cheers! Cheers! Cheers! Cheers! Cheers!
Give me a number: 5
A 5-foot cube has a volume of 125 cubic feet.
Cheers! Cheers! Cheers! Cheers! Cheers! Cheers! Cheers! Cheers!

① 只有在函数使用了名称空间std中的成员时,才在该函数中使用了using编译指令。

② main()使用函数名和参数来调用void类型的函数。

③ 由于cube()有返回值,因此main()可以将其用在赋值语句中。

  • 为什么需要原型?

    原型描述了函数到编译器的接口。它将函数返回值的类型以及参数的类型和数量告诉编译器。

    ② C++编程风格是将main()放在最前面,因为它通常提供了程序的整体结构。

  • 原型的语法

    ① 函数原型是一条语句,必须以分号结束。

    ② 函数原型不要求提供变量名,有类型列表就足够了。

    ③ 通常,在原型的参数列表中,可以包括变量名,也可以不包括。原型中的变量名相当于占位符,因此不必与函数定义中的变量相同。

  • C++原型

    ① 在C++中,原型是必不可少的。

    ② 在C++中,括号为空和在括号中使用关键字void是等效的,意味着函数没有参数。

  • 原型的功能

    ①  编译器正确处理函数的返回值。

    ② 编译器检查使用的参数数目是否正确。

    ③ 编译器检查使用的参数类型是否正确。如果不正确,则转换为正确的类型。

  • C++自动将传递的值转换为原型中指定的类型,条件是两者都是算术类型。仅当有意义时,原型化才会导致类型转换。

  • 在编译阶段进行的原型化被称为静态类型检查(static type checking)。可以看出,静态类型检查可捕获许多在运行阶段非常难以捕获的错误。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C语言中的宏定义
c语言的36个关键字
ADA语言基础教程
const在函数前与函数后的区别
【连载】(函数声明和简单的Makefile文件)乐创DIY C语言讲义​——4.2节
C++中const用法浅析 - 中华考试网(Examw.Com)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服