在上一节,我们已经学会了如何阅读函数原型和如何调用一个函数。然而,仅靠系统给出的标准库函数是不够用的。我们有时候要根据我们的实际要求,写出一个合适自己使用的函数。
那么,我们如何来自己动手编写一个函数呢?

首先,我们要告诉电脑,我们自己编写了一个函数,即这个函数是存在的,这叫作函数的声明(Declaration)。其次,我们要告诉电脑这个函数是怎么运作的,这叫作函数的定义(Definition)。显然,函数的声明和函数的定义是两个不同的概念。 声明表示该函数存在,而定义则是表示该函数怎么去运行。

我们平时做事都是要有先后顺序的,如果把次序颠倒了可能会惹些麻烦出来。编写函数的时候也一样。我们必须在调用一个函数之前就告诉电脑这个函数已经存在了,否则就成了“马后炮”。 所以,我们一般把函数的声明放在主函数前面。

函数的声明

在C++中,函数原型就是函数的声明。所以,函数原型除了向用户说明如何使用一个函数以外,还告诉电脑存在这样一个可以使用的函数。

我们已经介绍了函数原型的结构,只不过“产生结果类型”这个名称是为了方便理解而起的。它应该称为“返回值类型”,用任意一种数据类型来表示,比如int或者char等等,当然还包括空类型void。多个参数则构成了“参数表”,表示运行这个函数需要哪些数据。于是,函数原型的结构就是:
     返回值类型函数名(参数表);
函数声明同变量的声明一样,是一句语句。所以在语句结束要加上分号。函数名、参数名的规则和注意事项同变量名一样。

关于“返回”的概念稍后再作介绍,我们先来说说参数表。我们知道,在声明函数的时候,会写一些参数,而在调用函数的时候需要一一对应地填入这些参数。虽然它们都叫参数,但在不同的情况下,它们的含义是不同的。 在声明一个函数的时候,参数是没有实际值的,只是起到一个占位的作用,所以称为形式参数,简称“形参”;在调用一个函数的时候,参数必须有一个确定的值,是真正能够对结果起作用的因素,所以称为实际参数,简称“实参”。 我们拿数学中的函数作为例子,g(x,y)=x/4+y中的x和y就是形式参数,而g(4,1)=4/4+1=2中的4和1就是实际参数;如果令a=4、b=1,那么g(a,b)中的a和b也是实际参数。

函数的定义

说完了函数的声明,我们来说函数的定义。其实函数的定义对大家来说是比较熟悉的。因为我们之前所写的程序都是对主函数的定义。函数定义的格式为:
没有分号结尾的函数原型
{
    语句块;
}

我们把函数定义中没有分号结尾的函数原型称为函数头,把之后的语句块称为函数体。任何一个函数的定义不能出现在另一个函数体内。但函数体内可以调用任何一个函数,包括其本身。
下面我们先来看一个例子,你就会对函数定义有些了解了。(程序6.2.1)

运行结果:
5
程序在运行的时候从main函数开始,遇到调用一个用户定义的函数max,则去查找这个max函数的定义,然后运行max函数。运行完了以后,回到调用max函数的地方,继续后面的语句,直到程序结束。所以整个程序的运行过程如箭头所示。

不要使用相同的变量和参数

如果在一个班级里有两个同名同姓的同学,那么老师上课点名将是件麻烦事。因为大家都搞不清到底是在叫谁。可是,如果两个不同的班级有两个同名同姓的同学,就不会发生这种尴尬,因为老师在不同的教室点相同的名字,会有反应的只有一个同学。

我们把这个问题套用到函数上来。如果在同一个函数有两个名字相同的变量,那么电脑将无法分清到底要使用哪个变量,导致错误发生。而在不同的函数中,即使有相同名称的变量,由于在某一个函数中该变量的名称是唯一的,电脑也能方便的识别要使用哪个变量。因此,我们得到这样一个结论: 一般情况下,在同一个函数中,不能有名称相同的变量或参数;在两个不同的函数中,可以有名称相同的变量或参数。

下面就让我们来看一个实例:(程序6.2.2)
#include "iostream.h"
int max(int a,int b,int c);//求三个整数的最大者
int min(int a,int b,int c);//求三个整数的最小者
void output(int a);//输出功能
int main()
{
   int a=3,b=4,c=2;
   output(max(a,b,c));//把max函数的返回值作为output函数的实参
   output(min(a,b,c));
   return 0;
}
int max(int a,int b,int c)//不在同一个函数中,参数名重复没关系
{
   if (a>=b && a>=c) return a;
   if (b>=a && b>=c) return b;
   return c;//一旦执行了前面的return,这句就不会被执行到
}
int min(int a,int b,int c)
{
   if (a<=b && a<=c) return a;
   if (b<=a && b<=c) return b;
   return c;
}
void output(int a)
{
   cout <<a <<endl;
   return;//返回空类型
}
运行结果:
4
2
要注意,一旦函数运行结束,那么该函数中声明的参数和变量都将消失。就像下课了,同学们都回家了,老师叫谁都是叫不应的。

C++函数声明和定义相关推荐

  1. c语言函数声明定义参数命名,C语言函数声明与定义

    C语言函数声明与定义教程 在 C语言函数声明与定义 语法 type funcName(paramType1 param1, paramType2 param2){ // 执行语句... return ...

  2. C语言 函数声明和定义 - C语言零基础入门教程

    目录 一.简介 二.函数返回值 1.函数没有返回值 2.函数有返回值 三.函数参数 1.函数没有参数 2.函数有固定参数 3.函数有不定长度参数 四.函数声明和定义 1.函数声明:不需要实现这个函数的 ...

  3. python函数的声明_Python函数声明与定义

    Python函数声明与定义教程 在 Python函数声明与定义详解 语法 def funcName(param1, param2): # do return [val] 参数 参数 描述 def 定义 ...

  4. 搞不懂c++ 的函数声明与定义

    一.函数的声明: C++函数的声明的作业就是:告诉编译器函数名称及如何调用函数.函数的实际主体可以单独定义.(你考试考了59分告诉了你妈妈准备要打你) 二.函数的定义: 函数的定义一般主要有5个步骤: ...

  5. 关于C++模板函数声明与定义的问题

    关于C++模板函数声明与定义的问题 关于C++模板函数声明与定义的问题 模板函数出现的问题 模板函数问题解决 模板函数出现的问题 今天在写代码的时候,发现了一个关于模板函数的问题.如下所示, demo ...

  6. c++ 函数声明与定义

    文章目录 一.函数的声明 二.函数的定义 三.函数声明与定义使用区别 四.为什么 C++ 允许多次声明呢? 五.分文件开发 一.函数的声明 函数声明的作用: 告诉编译器函数名称及如何调用函数.函数的实 ...

  7. JS基础篇--函数声明与定义,作用域,函数声明与表达式的区别

    Scoping & Hoisting 例: var a = 1;function foo() {if (!a) {var a = 2;}alert(a); };foo(); 上面这段代码在运行 ...

  8. c语言函数实际参数,C语言:函数声明与定义的参数不一致问题,后果可能很严重哦!!!!!...

    具体: 在文件main.c中 int func ();     //声明中没参数 int main(){ int c = func();            //调用时也不传参,这样才能编译通过 p ...

  9. scala 函数中嵌套函数_Scala函数–声明,定义,调用和嵌套函数

    scala 函数中嵌套函数 A function is a set of statements combined together to perform a specific task. The co ...

最新文章

  1. Spring中获取Session的方法汇总
  2. FCKeditor所有版本任意文件上传缺陷
  3. 用docker安装mysql5-6,并远程连接
  4. Java ServletContextListener用法
  5. suse php5,简简单单搭建linux SuSE LAMP环境
  6. 【基础】SQL Server系统库的作用
  7. hadoop 二次开发DatanodeWriteTimeout设置
  8. HTML+CSS+JS实现 ❤️3D奥运五环图形特效❤️
  9. JQuery模拟boostrap模态框效果
  10. 深度学习-吴恩达-笔记-1-深度学习引言
  11. Vc中对话框数据交换和验证机制
  12. Mesos:拒绝微软1.4亿美金收购的独角兽
  13. ICMPV6协议及NDP协议
  14. 四级词汇——不择手段记单词new
  15. 【热点资讯】哪所英国大学最适合你?
  16. CSS 滚动快照 Scroll Snap
  17. 安全防护与信息加密:一个新的挑战
  18. Adobe After Effect (AE) cc2020 安装教程【64位】
  19. 羽毛球业余分级新标准
  20. 30题前端工程开发师面试题

热门文章

  1. acl审计软件_什么是IT审计员?风险评估的重要角色
  2. 2020 华工 数据结构-平时作业_【激光】从上海工博会看华工激光的差异化路线...
  3. CleanFlight 源码分析 一,任务调度
  4. mysql 文件组织_数据库如何组织数据?
  5. 什么情况下选择linux,在哪种情况下建议选择BSD系统而不是Linux?
  6. get请求可以传数组吗_王源 袁冰妍 孟美岐 手套在大片中的时尚,普通人可以get吗...
  7. hive把字符串转换为时间_关于hive的时间转换
  8. 在php100 防恶意注册这个需要怎么填,WordPress防止恶意注册代码
  9. win32 禁用缩放功能_Firefox 73 将引入全局缩放功能,在所有网站都可适用
  10. python代理池_用Python搭建一个简单的代理池