• 1. 2018/10/171第2章 VC程序基础—— 变量与函数 2.1 变量的生存期与作用域 2.2 指针与引用 2.3 函数的声明与调用 2.4 函数参数的传递 本章从变量的五个要素着手,围绕它讲了变量的各种生存期和作用域。另外还对一种特殊的变量——地址变量进行了讲解。本章主要讲了与函数有关的定义、实现以及调用的三种方式。掌握了变量与函数,就把程序设计的基本把握住了,因此本章属于VC程序设计的基础知识。
  • 2. 2018/10/172 2.1 变量的生存期与作用域 2.1.1 变量的五要素 2.1.2 VC程序的存储组织 2.1.3 变量作用域及其分类 2.1.4 一个VC多文件应用程序的实现 2.1.5 变量生存期及其分类 2.1.6 VC中的数据类型
  • 3. 2018/10/1732.1.1 变量的五要素1.变量的名称 2.变量的数据类型 3.变量的值 4.变量的地址 5.变量的存储类型
  • 4. 2018/10/1742.1.2 VC程序的存储组织 一个VC程序编译运行后,将其对应的目标代码调到内存中。 目标代码主要包含操作符和操作数, 其中操作符存放在代码区,程序中处理的数据(操作数)分别存放在静态存储区和动态存储区。 一个VC程序可以使用的存储空间分为如下三个部分: 代码区 静态存储区 动态存储区
  • 5. 2018/10/175 变量的作用域是指在程序中变量的有效区域,它是变量的活动空间。“铁路警察各管一段”,描述的就是铁路警察这些变量的作用域为各自的一段。在VC中,变量的作用域有六种,从其作用范围的大小由小到大依次为:块作用域、函数作用域、类作用域、命名空间作用域、文件作用域、程序作用域。变量的作用域取决于变量的位置与声明的方式。2.1.3 变量作用域及其分
  • 6. 2018/10/1761.块作用域 块指的是由一对“{”、“}”括起来的程序段。在块中声明的变量具有块作用域,其作用域从声明处开始,一直到块结束的花括号为止。复合语句也是一个块,例如if语句中定义的变量只能在if语句中使用,for语句中定义的变量,包括括号表达式中定义的变量,只能在for语句中使用。 下面演示块作用域的实例:
  • 7. 2018/10/177【例2-1】演示块作用域的实例:输入两个数将由大到小的顺序保存,并输出结果 #include "iostream.h" #include void main() { int x,y; cout<<"请输入两个整数:"<>x>>y; if(x<=y) //x中保存较大的数,y中保存较小的数 { int t; //t为临时变量,其作用域为块作用域 t=x; //交换x与y的值 x=y; y=t; } cout<<"x="<
  • 8. 2018/10/1782.函数作用域函数作用域是在某个函数内起作用,例如函数的形式参数具有函数作用域,它们起始于函数体开始的第一个左花括号“{”,结束于标志函数体结束的最后一个右花括号“}”。 可以说函数作用域是一种特殊的块作用域。一个函数内可以有多个块,因此函数作用域大于块作用域。
  • 9. 2018/10/179【例2-2】演示函数作用域的实例:将一个整数的各个位上的数字加起来(用函数完成),并输出结果。 #include "iostream.h" #include int SumDigits(int x) //x为形式参数,其作用域为该函数,在该函数外不可访问 { int sum=0; //x为函数内定义的变量,其作用域为该函数 while(x) { sum+=x%10; //求个位数字 x/=10; //原数字缩小10倍 } return sum; //sum保存各位数字之和 } void main() { int a; cout<<"请输入一个整数:"<>a; cout<
  • 10. 2018/10/17103.类作用域 下一章要讲类与对象,在类中包含成员变量与成员函数。一个类中的成员变量在该类的任何成员函数中都可以访问,因此类的作用域是整个类的定义空间。4.命名空间域 一个工程中的多个文件中有可能存在相同的变量,为了区别这些变量,可以将在不同文件中的相同变量防到放到两个不同命名空间中,通过命名空间来确定变量作用范围的作用区域叫命名空间作用域。该小节牵涉的东西请查阅相关资料。
  • 11. 2018/10/17115.文件作用域在函数(以及下一章要讲的类)以外声明的、并且用“static”修饰的变量,具有文件作用域。其作用域起始于变量的声明处,终止于文件的结束处,具有该作用域的变量又称全局变量。该种类型的变量仅仅在该文件中是全局的,别的文件不能使用。 文件作用域又叫单文件作用域。 下面是文件作用域的实例
  • 12. 2018/10/1712【例2-3】文件作用域的实例。本程序定义了一个全局变量x,其作用域为整个文件。 #include "iostream.h" #include static int x=6903410; void Swap(int x,int y) //利用加法完成两个数的交换 { x=x+y; //此处的x与y为函数作用域 y=x-y; x=x-y; cout<<"Swap()函数中的x为"<>x; ++x;//main函数中的x加1 cout<<"main()函数中的x值为"<
  • 13. 2018/10/17136.程序作用域 如果一个变量的存储类别为外部(extern)类型,则称该变量为外部变量。外部变量带有赋值的声明称为定义性说明,外部变量不带有赋值的声明称为引用性说明。 extern char choice=’y’; //定义性声明 extern float money ; //引用性声明 定义性声明指示编译器程序为该外部变量分配内存,而引用性声明仅告诉编译程序该名字的变量在程序的其它地方已经有了定义性声明。 外部变量是全局变量、动态生存期变量,所以其作用域大、寿命长。
  • 14. 2018/10/17142.1.4 一个VC多文件应用 程序的实现 在大型复杂的应用程序中,一个任务常常划分成多个模块,每个模块是由不同的人员编写,当然不同的人编制的代码应放在不同的文件中,最后要把这些文件统一起来,放到一个工程中。此时,在自己的文件中如何访问别的文件中的变量或函数,又如何控制别人编的文件不能使用自己的变量呢? 这就牵涉到如何使用程序作用域的变量。
  • 15. 2018/10/1715【例2-4】建立一个包含多个文件的程序。该工程的名字为ProgScope 1.建立一个空的控制台工程(1)单击VC集成开发环境菜单File|New,选择Projects选项。该选项下列出了VC可以开发的17种应用程序的类型。我们选择基于字符界面的“Win32 Consloe Applications”控制台应用程序类型。如图2.1所示。 (2)在“Project Name”编辑框内填写工程的名字“ProgScope”,并在“Location” 编辑框内填写工程所在的目录。我们选择的是“E:\VCPP”。这样,当最后生成一个应用程序时,就在E:\VCPP的目录在生成一个新目录ProgScope ,在“E:\VCPP\ ProgScope ”目录下,存放的是与该工程有关的一系列文件。 (3)单击按钮“Ok”,进入到图2.2所示的界面中。该界面让用户选择Win32 控制台应用程序的类型。我们选择第一种“A empty project”。单击“Finish”按钮,进入到图2.3所示的界面。 (4)图2.3是对生成工程总的信息描述,没多大意义。单击“OK”按钮生成ProgScope应用程序框架。
  • 16. 2018/10/1716【例2-4】建立一个包含多个文件的程序。该工程的名字为ProgScope 图2.1 选择应用程序类型对话框
  • 17. 2018/10/1717【例2-4】建立一个包含多个文件的程序。该工程的名字为ProgScope 图2.2 选择控制台工程类型图2.3 生成的控制台工程信息
  • 18. 2018/10/1718【例2-4】建立一个包含多个文件的程序。该工程的名字为ProgScope2.在工程中增加C++源文件(1) 单击File|New,选择Files选项卡,该选项下列出了VC可以使用的文件类型。我们选中C++ Source File列表项,并在右边的File编辑框中输入新建单文件C++文件名称File1。同时选中“Add toProject:”复选框。如图2.4所示。最后按OK按钮,返回到Microsoft Visuall C++的主窗口,在其中输入如下的程序源代码: #include "iostream.h" extern int File2_x; //引用性声明,表示要使用别的文件中的File2_x变量 void main() { cout<<"File2.cpp中的变量File2_x="<
  • 19. 2018/10/1719【例2-4】建立一个包含多个文件的程序。该工程的名字为ProgScope (2)用同样的方法在工程ProgScope中添加另一个源文件File2.cpp,该文 件中的代码为: extern int File2_x=222; //定义性声明变量File2_x,它是一个程序作用域的变量,别的文件可以访问它,前面的extern可省略 图2.4 在工程中增加源文件File1.cpp
  • 20. 2018/10/1720【例2-4】建立一个包含多个文件的程序。该工程的名字为ProgScope 3.运行该工程 按“Ctrl+F5”,VC编译器编译、链接并运行该程序,程序的运行结果为: File2.cpp中的变量File2_x=222 自己尝试把File2.cpp中的语句“extern int File2_x=222;” 前的extern改为static,看程序还能不能运行,并分析原因。
  • 21. 2018/10/17212.1.5 变量生存期及其分类 变量的生存期 指程序运行过程中变量占用内存或寄存器的时间 它由声明变量时选择的存储类型来决定的。 任何一个类型的变量都有自己的生存期,在生存期内,变量将保持它的值不变,直到它被更新止。 变量生存期的分类 静态生存期 动态生存期
  • 22. 2018/10/17222.1.6 * VC中的数据类型 衡量一种程序设计语言优劣的首要标准就是它所提供的数据类型,能不能使用户把客观世界多种多样形态的实际问题方便而又灵活地抽象为适当数据类型加以处理。 VC提供了丰富的数据类型,主要包括基本类型和非基本类型。 基本类型主要包括char(字符型)、int(整型)、shor(短整型)、long(长整型)、bool(逻辑型)、float(单 精度实数)、double(双精度实数)等。 非基本类型主要包括枚举型(用enum定义)、数组型、指针型、空类型(void)、结构体类型(用struct定义)、公用体类型(用union定义)和下一章要讲的类类型(用class定义)。
  • 23. 2018/10/17232.2 指针与引用 2.2.1 地址与指针的概念 2.2.2 指针变量定义与赋值 2.2.3 数组指针与指针数组 2.2.4 动态内存分配:new与delete 2.2.5 引用
  • 24. 2018/10/17242.2.1 地址与指针的概念VC语言拥有在运行时获得变量地址和操纵地址的能力,这种可用来操纵地址的变量类型就是指针。指针可以用于数组,用于内存访问,还可作为函数的参数。 指针就是地址,它也是一种数据类型,具有指针类型的变量称为指针变量。指针变量也是一个变量,只不过这个变量是用来放地址的,是用来存放别的变量地址的。
  • 25. 2018/10/17251.指针变量定义 VC中指针变量的定义形式为: 数据类型名 * 指针变量名;注意:指针的类型为它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针的数据值都是unsigned long int型。因此指向的类型不同,指针的类型就不同。2.2.2 指针变量定义与赋值例如: int a, *pa; double *p1; POINT *p2; CDC *pDC; int (*p3)[6]; int (*p4)();
  • 26. 2018/10/17262.指针变量的赋 一个指针变量可以有三种状态: 未赋任何值,“悬空”状态(最严重的错误); 被赋予NULL值,(指向一个安全的位置); 指向某一个变量(程序员必须用的操作)。
  • 27. 2018/10/17272.指针变量的赋值 int *ptr; float a=6.6,b,c[3] ; float *pa=&a; //声明指针变量pa,并将浮点数a的地址赋给它 float *pb=NULL; //将指针指向安全的位置 float *pc=c; //将数组C的起始地址赋给指针变量pc 下面是对一些指针变量赋值的例子:
  • 28. 2018/10/1728【例2-6】指针使用实例。 #include "iostream.h" #include void main() { int x,y; int *ptr; //定义指针变量ptr y=20; x=10; ptr=&x; //对指针变量ptr初始化,使得其指向变量x cout<<"变量x的值为"<
  • 29. 2018/10/17292.2.3 数组指针与指针数组1.数组 数学上,常用一个向量(vector)表示一些相关数据组成的序列,在程序设计语言中是用数组来表示的。数组是由一定数目的同类元素顺序排列而成的结构类型数据(可把数组看成一种数据类型,一种复合数据类型)。在计算机中,一个数组在内存中占有一片连续的存储区域,VC的数组名就是这块存储空间的地址。 例如: int score[100] ;
  • 30. 2018/10/17302.数组指针数组指针是一个指针,该指针指向的是数据类型是数组类型,它存放的是数组的起始地址。其实数组中的每一个元素都是一个变量,既然是变量,则他们就具有地址。C++规定,数组的地址用数组名来表示,即数组名表示的是第一个元素的地址 。 例如: int(* ArrayPtr)[100];
  • 31. 2018/10/17312.2.4 动态内存分配: new与delete 在VC中,动态内存分配技术可以保证我们在程序运行的过程中,根据实际需要而申请适量的内存,在使用结束后还可以释放。这些功能的实现靠new和delete 函数。 1.new运算 运算符new的功能是动态分配内存,或者称为动态创建堆对象。其语法形式为: new 类型名T(初值列表);
  • 32. 2018/10/1732例如: int *pi; //声明指向整型数的指针变量pi float *pf; //声明指向浮点数的指针变量pf char *pc; //声明指向字符的指针变量pc pi=new int; //动态产生一无名的整型变量,该变量 的地址保存在指针变量pi中 pf=new float(13.5); pc=new char[3];
  • 33. 2018/10/17332.delete运算 运算符new的功能是动态分配内存,当用户不再需要这些内存的时候,必须将其显式地释放,释放new所分配空间的函数是delete,其语法形式为: delete 指针变量名;例如: delete *pi; //释放pi指向的动态int变量 delete *pf; //释放pf指向的动态float变量 delete []pc; //释放pc指向的动态char数组
  • 34. 2018/10/1734【例2-7】 new和delete实例测试。 void main() { char *pString1="VC++6.0程序设计简明教程"; //定义指向字符的指针变量 puts(pString1); //输出pString1所指向的字符串 int *pi; //定义指针变量pi pi=new int;//在栈区分配四个字节的空间,起始地址给了pi *pi=35; //将35赋给pi所指向的无名变量 printf("%8d\n",*pi); //输出无名变量的值 delete pi; //释放pi所指向的无名变量的内存空间,在用户程序有一个new一定得有一个delete char *pString2=new char[40]; //定义指向字符的指针变量 strcpy(pString2,pString1); cout<
  • 35. 2018/10/17352.2.5 引用引用的概念 引用是一个变量的别名,是一个目标对象的替代名,它由符号&来引导。 引用类似于一个人的外号,当给某个人起了一个外号时,这个外号就是这个人的引用。因此,对这个人的外号操作,就是对这个人的操作, 类似地,对一个变量的引用操作,就是对这个变量操作。
  • 36. 2018/10/1736【例2-8】引用实例测试。 void main() { int One=3; int &OneRef=One; /*定义引用OneRef,同时对其进行初始化为变量One,此时OneRef就是One的外号,引用必须在定义时就进行初始化*/ cout<<"One="<37. 2018/10/1737【例2-8】引用实例测试。 运行结果为: One=3 OneRef=3 One=4 OneRef=4 One=34 OneRef=34
  • 38. 2018/10/17382.3 函数的声明与调用 2.3.1 函数与模块 2.3.2 函数的声明 2.3.3 函数的定义 2.3.4 函数的参数与返回值 2.3.5 函数调用
  • 39. 2018/10/17392.3.1 函数与模块 一个程序可以分成多个相互独立的程序段,这些程序段被称为函数。函数是一个完成一定功能的独立执行代码。当所要执行的程序很大时,需要以一种比较容易管理的方式来组织源代码,通常是将程序划分为若干模块。 C++语言使用文件作为划分模块的主要机制,这些组成C++程序的文件称为文件模块,简称为模块。
  • 40. 2018/10/17402.3.1 函数与模块 VC有两种程序模块: 函数(function)。其中函数也有两类:一类为类似于C语言中的普通函数(类体外的函数),另一类为类中的成员函数。其区别是前者不属于某个类,而后者却属于某个类,即前者的作用域要大于后者。 类(class)。包含成员变量和成员函数。 函数的作用有两个: 一是实现任务划分,将一个比较复杂的任务划分成若干个简单的任务,每一个任务可以由一个或多个函数组成,函数的使用,便于任务的分工与处理,便于验证程序的正确性; 二是实现软件的源代码复用,把一些功能相似的程序段组织成函数,使得函数的代码只有一处,而调用却可以有多处,但却不需要编写雷同的代码。
  • 41. 2018/10/17412.3.2 函数的声明 函数和变量一样,在使用之前应该先声明。VC中一种函数的引用性声明——函数原型,它的一般形式为: <函数返回值的类型声明><函数名>(<参数表>);
  • 42. 2018/10/17422.3.2 函数的声明 在VC中函数必须要有原型,这是VC区别于C的一个方面。函数原型的作用是告诉编译器有关函数的信息:函数的名称、函数参数的类型、函数返回值的类型、函数参数的个数、函数参数的顺序。VC编译器是根据函数原型来检查函数调用的正确性。 我们在编写C++程序时,都有大量的#include “… .h”的字样,这实质上是一条编译预处理指令。它把系统定义的函数或自定义的函数包含进来。切记它只是包含了函数的原型,真正的函数实现代码并没有包含进来。编译器根据这些函数的原型来检查用户调用是否正确。
  • 43. 2018/10/17432.3.2 函数的声明下面为从math.h中抽取出的一段函数原型说明,从函数的名字可以看出其功能。 int __cdecl abs(int); double __cdecl acos(double); double __cdecl asin(double); double __cdecl atan(double); double __cdecl cos(double); double __cdecl exp(double);
  • 44. 2018/10/17442.3.3 函数的定义 函数的定义包括函数头和函数体两部分。函数头定义函数的名称、参数函数返回值类型等,函数体则定义函数的算法实现。 函数定义的一般形式是: 函数类型 函数名(数据类型1 形参1,数据类型2 形参2…) { //函数体 }
  • 45. 2018/10/17452.3.3 函数的定义 函数名是一个标识符——以字母、下划线或数字组成并且必须以字母和下划线开头的字符序列,函数类型是指函数的返回值类型,可以是基本数据类型或复合数据类型。如果一个函数没有返回值,则可以将它的返回类型指定为void。void也是C++提供的一种基本数据类型,表示“空值”,它不能作为操作数参与任何运算。函数名称后为形式参数表,它是用逗号分隔的参数说明表列。函数体是指用“{”和“}”括住的语句序列,分为说明部分和语句部分,在一个函数体中,这两个部分可以交替出现,但对某具体变量来说,应先声明后使用。
  • 46. 2018/10/1746【例2-9】定义一个求两个数的较小数的 函数min()。 int min(int x,int y) //函数定义部分 { return x
  • 47. 2018/10/17472.3.4 函数的参数与返回值 函数的参数和返回值是函数的两个重要方面。 函数的调用是程序模块之间的通讯,函数在调用时将数据传递到被调用函数中。函数的返回值是函数之间传递信息的通道。 1.函数的实参与形参 函数的参数分为形式参数(简称形参)和实际参数(简称实参)。 调用函数的参数称为实参。 被调用函数的参数称为形参。
  • 48. 2018/10/17482.函数返回值的实现 函数的类型就是函数返回值的类型,当函数没有返回值时,其函数的类型为void,有返回值的函数必须在其函数体中出现return语句,其格式为: return <表达式>;
  • 49. 2018/10/17492.函数返回值的实现(1)计算<表达式>的值。C++ 中有丰富的算术、逻辑、逗号、条件、关系表达式等。不管是什么样的表达式,只需记住表达式是一个值,这个值是根据相应的表达式的规则计算出来的。 (2)将<表达式>的类型转换为函数的返回值类型 (3)将<表达式>的值赋给一个临时变量; (4)程序的控制权发生转移,由被调用函数转移到调用函数,同时将临时变量传递给调用函数加以使用; (5)释放临时变量,函数调用完成,执行调用函数的下一条语句。
  • 50. 2018/10/17502.3.5 函数调用 在VC中,除了主函数外,其他任何函数都不能单独作为程序运行。任何函数功能的体现都必须通过主函数直接或间接调用来进行。函数调用就是使程序的流程发生改变,转去执行指定函数的函数体,函数调用完成后,再接着执行调用函数语句的下一条语句。 函数调用的一般格式为: 函数名(实参表);
  • 51. 2018/10/17512.3.5 函数调用 函数调用要做的工作是:指定函数名并提供实参。 函数名是函数的地址,实参提供被调用函数执行任务所需要的信息及接受被调用函数返回的信息。 函数调用时,要发生实参和形参的结合,一般实参和形参在个数、类型、位置上一一对应。
  • 52. 2018/10/1752【例2-10】调用前面定义的求两个数中的较小数的函数的实例#include void main() { int min(int x,int y); //函数原型说明部分 cout<<"Please input two integer:"; int a,b; cin>>a>>b; cout<<"The minium number is: "<
  • 53. 2018/10/1753【例2-10】调用前面定义的求两个数中的较小数的函数的实例。 分析:虽然函数min()的定义出现在对它的调用之后,然而,由于使用了函数原型,程序就可以得到正确的结果。在函数原型中,函数参数的名字可以省略,但参数的类型不能省略,上例中函数原型可以改写为: int min(int,int); 从上述例子可以看出函数原型与函数定义的区别在于:函数原型没有函数体部分,而且是用分号结束的,很像变量的声明。如果需要在函数定义之前调用函数,则需要在调用之前使用函数原型进行声明。但如果函数定义在前,函数调用在后时,调用前可以不说明。
  • 54. 2018/10/17542.4 函数参数的传递 2.4.1 参数的传递方式 2.4.2 值传递 2.4.3 地址传递 2.4.4 引用传递 2.4.5 缺省参数
  • 55. 2018/10/17552.4.1 参数的传递方式 参数是调用函数与被调用函数之间进行通信的桥梁。函数定义首部的参数称为形参,调用函数时使用的参数称为实参。在函数被调用时,系统建立与实参对应的形参存储空间,函数执行完毕,系统收回分配给形参的临时存储空间,这个过程称为参数传递或参数的虚实结合,函数通过形参与实参来进行通信。 C++有3种参数传递机制:值传递、地址传递、引用传递。
  • 56. 2018/10/17562.4.2 值传递 值传递又称拷贝传递方式,顾名思义,拷贝传递方式就是将实际参数拷贝一份,传给对应的形参。由于形参得到的是拷贝的那一份,它和实参那份是不同的,即对应形参和实参变量在内存的位置不同,它们是不同的变量,唯一共同点是它们的值是一样的。因此在函数体内对形参的修改,只是在这个临时建立变量上的修改,与实参无关。当函数调用结束后,形参被释放,生命期也就结束了,因此在调用函数中是无法修改实参的。
  • 57. 2018/10/1757【例2-11】值传递测试。 #include "iostream.h" void SwapByValue(int x,int y); //值传递的交换函数原型说明 int main(int argc, char* argv[]) { int a=6,b=8; cout<<"未调用函数前a="<58. 2018/10/1758【例2-11】值传递测试。 程序的运行结果是: 未调用函数前a=6 b=8 在值传递函数中x=8 y=6 值传递后a=6 b=8 程序分析: main()函数调用SwapByValue函数时,系统在栈区开辟空间给变量x与y,把实际参数a与b的值赋给x与y,此时x与y是6与8,当执行了交换函数的前三条语句后,x变成了8,y变成了6,最后一条输出语句的运行结果说明了这一点。SwapByValue函数交换的只是x与y,与a和b没有关系,main()函数输出a与b的值见证了这一点。
  • 59. 2018/10/17592.4.3 地址传递 指针传递是通过函数定义中的形参被说明为指针类型来加以实现的。由于形参被说明为指针类型,根据实参向形参传递的三个一致“参数的类型一致、个数一致、顺序一致”规则,形参对应的实参应为地址表达式,即某个变量的地址。 调用函数时,实参把变量的地址赋给了形参这个指针变量。在被调用函数中往往通过指针变量间接访问实参所指的变量,这种把变量地址传给形参指针变量的方式称为地址传递或地址调用。
  • 60. 2018/10/1760【例2-12】地址传递测试。 void SwapByRefer(int &x,int &y); //引用传递的交换函数的原型说明 int main(int argc, char* argv[]) { int a=6,b=8; cout<<"未调用函数前a="<61. 2018/10/1761【例2-12】地址传递测试。 程序的运行结果是: 未调用函数前a=6 b=8 在引用传递函数中x=8 y=6 引用传递后a=8 b=6 程序分析: main()函数调用SwapByRefer 函数时,由于引用并不是变量,系统不需要在在栈区为相应的形参数x与y开辟新的存储空间,形参与实参的结合说明,形参x是实参a的引用,形参y是实参b的引用。交换函数的前三条语句的作用是,交换引用x与引用y的值,即交换变量a与变量b的值,因此执行完这三条语句后,变量a与变量b的值发生互换。最后一条输出语句要求输出引用x与引用y,即输出原先b的值8与原先a的值6。SwapByRefer函数是把引用x与引用y交换,即a与b交换,main()函数输出a与b语句的运行结果见证了这一点。
  • 62. 2018/10/17622.4.4 引用传递 引用的实质是给变量其了一个别名,这样,当形参和实参结合时,对应的形参就是相应实参的别名。在调用函数内对形参的修改就是对实参的修改,在调用函数外对实参的修改,当进入被调用函数内时,相应的形参就是已经修改了的实参。因此引用传递的理解比较简单,形参和实参在操作的结果是同步的,形参的值就是实参的值。当C++函数的形式参数被定义为引用类型,称为引用参数。引用参数对应的实际参数为一个变量或对象。函数被调用时,形参不需要开辟新的存储空间,形参名作为引用绑定到实参上,即形参变为实参的别名。
  • 63. 2018/10/1763【例2-13】引用传递测试。 void SwapByRefer(int &x,int &y); //引用传递的交换函数的原型说明 int main(int argc, char* argv[]) { int a=6,b=8; cout<<"未调用函数前a="<64. 2018/10/1764【例2-13】引用传递测试。 程序的运行结果是: 未调用函数前a=6 b=8 在引用传递函数中x=8 y=6 引用传递后a=8 b=6
  • 65. 2018/10/17652.4.5 * 缺省参数 缺省参数(又称默认参数)指的是,在VC中可以设置函数形参的默认值,下面例子中就有一个带有缺省参数的函数: GetVolume(int length,int width=2,int height=4); 其中width的默认值为2,height的默认值为4。缺省参数是在函数声明时就已经给定的一个值,若在调用函数时,没有传递给该形参的值——实参的话,那么编译器就自动插上这个值。
  • 66. 2018/10/1766【例2-14】带有缺省参数的求体积函数测试。 int GetVolume(int length,int width=2,int height=4); //求体积的函数原型,它有两个缺省参数 int main(int argc, char* argv[]) { int length=10,width=20,height=30; cout<<"传递3个实参的体积为"<
  • 67. 2018/10/1767【例2-14】带有缺省参数的求体积函数测试。 程序运行结果为: 10 20 30 传递3个实参的体积为6000 10 20 4 传递2个实参的体积为800 10 2 4 传递1个实参的体积为80
  • 68. 2018/10/1768使用缺省参数的注意事项: (1)如果一个函数有多个缺省参数,则在形式参数的分布中,缺省参数应从右向左排列,在函数调用时,只能从左匹配; (2)缺省参数的值可以是全局变量、全局常量,甚至是函数,但不可以是局部变量; (3)如果函数有原型声明时,则缺省参数的说明只能在函数的原型声明中,而不能出现在函数的定义说明中; (4)如果函数只有定义说明而没有原型声明时,则缺省参数的说明可以出现在函数的定义中。