C++函数和作用域专题

上传人:豆浆 文档编号:36334581 上传时间:2018-03-27 格式:PDF 页数:37 大小:1.68MB
返回 下载 相关 举报
C++函数和作用域专题_第1页
第1页 / 共37页
C++函数和作用域专题_第2页
第2页 / 共37页
C++函数和作用域专题_第3页
第3页 / 共37页
C++函数和作用域专题_第4页
第4页 / 共37页
C++函数和作用域专题_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《C++函数和作用域专题》由会员分享,可在线阅读,更多相关《C++函数和作用域专题(37页珍藏版)》请在金锄头文库上搜索。

1、本文作者:黄邦勇帅本文是学习 C+最基础的内容,因此应对其熟练掌握,本文主要对函数作了介绍,包括函数的基本语法规则,参数传 递时的指针形参与const,引用形参与const,数组形参,函数指针,内联函数,默认实参,函数重载,函数重载解析, 作用域,存储持续期,链接性等作了全面的解析,本文尽量做到全面,本文内容由浅入深,易学易懂,对 C+中的难 点进行了大量的分析和示例讲解,难点主要包括数组形参,指针形参与const,引用形参与const,函数重载解析,链接 性。本文使用的是x86 机器(主流计算机都是x86 机器),windows xp操作系统,VC+2005 编译器进行讲解的。本文内容完全属

2、于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。声明:禁止抄袭本文,若需要转载本文请注明转载的网址,或者注明转载自“黄邦勇帅” 。主要参考文献: 1、C+.Primer.Plus.第五版.中文版 美Stephen Prata 著 孙建春韦强译 人民邮电出版社 2005 年5月 2、C+.Primer.Plus.第四版.中文版 Stanley B.Lippman、Barbara E.Moo著 李师贤等译 人民邮电出版社 2006 年3 月 3、C+.Primer.Plus.第三版.中文版 Stanley B.Lippman 等著 潘爱民 张丽译 中国电力出版社 2002 年5月

3、4、 程序设计语言C中华人民共和国国家标准GB/T 15272- 94 1994年12 月7日发布出版社不详 5、 C 和指针第二版 美 Kenneth A.Reek著 徐波译 人民邮电出版社 出版日期不详 6、 C 语言核心技术 Peter Prinz Tony Crawford 著 OReilly Taiwan 公司译 机械工业出版社 2007 年8 月 7、 ANSI C标准详解 作者、出版社、出版日期不详第第 6 部分部分 函数和标识符的作用域专题函数和标识符的作用域专题 (共共 5章章,共共 37页页)1、注意:函数是一种类型,函数类型是用于描术函数的,函数类型由其反回值类型,形参数

4、目和形参类型表征,函数 类型一般被称为“反回结果为某类型的函数” 。注意:形参的名称并不是函数类型的一部分,比如void f(int i, int j); 其中形参名i,j 并不是描术函数类型的一部分。 2、存储类区分符有4个:extern , static, auto, register。 3、类型限定词有2 个:const, volatile第第 1 章章 函数函数基基本语法规则本语法规则 (16页页,共共 6页页)1、函数:函数可以实现一种操作或者一种功能,在需要使用这种功能或者操作的地方只需直接调用函数便可,这样可 以减少重复的程序内容。比如使用某函数实现计算矩形的面积,当程序中只要出

5、现需要计算矩形面积的地方则只需 直接调用该函数便可实现计算矩形面积的功能,这样就大大减少了重复的相同程序。 2、函数是一种被动的实体,函数是不会自动执行的(主 main函数是通过特殊方式进行调用的),只有当被其它函数调用 时才会执行,当函数被调用时,则程序便转去执行被调用的函数,直到被调用的函数执行完毕,再转回来执行其后 的程序。函数的形式函数的形式为为: 反回类型 函数名(形参1,形参2,形参3,.)函数体一一、基本要求基本要求: 1、函数的反回类型不能是函数或数组类型 2、 形参的存储类区分符只能是register 和auto。 所有形参都具有自动存储期。 若形参中出现其他存储类区分符(即

6、 static , extern),则将被忽略。 3、 函数的形参是可选的, 也就是说函数可以没有形参(但函数名后的小括号不能省略), 若函数没有形参也可以使用void 来说明函数无形参;比如int f(); 表示定义了一个没有形参的函数f;再如int f(void) 同样表示定义了一个没有 形参的函数f。4、函数名之后的小括号不能省略,即使没有形参也应使用空的小括号,函数名后的小括号,是程序识别函数的标志, 比如int f错误,函数名后必须有小括号;再如int f; 此语句表示声明一个变量f,而不是声明一个函数f,要声明 函数应在函数名之后加上小括号,比如int f(); 表示声明一个函数。

7、 5、函数必须有反回类型,省略反回类型将是错误的,若函数没有反回值,其反回类型应是 void。比如 f(),是错误 的,正确的形式应是void f();而语句f(); 则表示调用一个函数(具体见后文) 6、函数体应是使用大括号”括起来的复合语句,而不能是一个单独的语句,即使是空语句也应使用空的大括号;比 如void f(); 在语法上没有错误,但这只是函数声明,因为这个函数没有函数体;再如void f() cout #include using namespace std;void f1(auto int i) /形参的存储类区分符只能是register和auto。 所有形参都具有自动存储期。

8、 若形参中出现其他存储类区分符(即 static , extern),则将被忽略 void f2(void)cout #include using namespace std;int i=1; /f1() /错误,函数必须有反回类型,省略反回类型将是错误的,若函数没有反回值, 其反回类型应是void。 正确形式是void f1() void f2()int a=1; return; if(a #include using namespace std; /1、若形参为指针且指向非const类型的对象,则实参不能是const类型对象的地址。/2、函数f是非引用类型形参,参数是按值进行传递的,形参p

9、得到的将是实参的值,注意,实参若是指针,则其值是指向的变量的地址, 而不是指向的变量的值,因此这时形参和实参会指向相同的地址; void f(int % (/此语句将改变实参所指向的地址的值(因为这时形参p和实参都指向的是相同的地址),也就是说改变了 实参指向的变量的地址中的值,这样就间接的修改了实参所指向的变量的值。 int b=2; p=“(/这里改变了形参p所指向的地址,但因为指针也是按值传递的,因此形参p的改变不会对实参产生影响,因此实 参仍指向的是原来的变量的地址, /此语句不会改变实参所指向的变量的地址中的值(因为这时形参p和实参指向的是不同的地址了),形参p改变的 是变量b的值。

10、 cout #include using namespace std;/重点1:不能复制数组,在传递数组时,传递的是指向实参数组的第一个元素的地址 /重点2:对于形参来讲,是不存在数组类型形参的,使用数组作为形参时,数组名会自动转化为指向第一个元素的指针 void f1(int aF/在函数的形参中为数组指定大小是没有意义的,这里的形参与void f(int aFG是相同的,都会被转换为指 向数组中第一个元素的指针,即相当于int D。 int b=1;a=IG/可以改变数组形参指向的地址,这是与数组名不相同的,这时的形参a并不是数组名,而是一个指针;这条 规则同样适用于多维数组形参。注意,这

11、条规则只适用于数组是形参时,当数组不是形参时,数组名与指针 并不完全等同。 /对于一维数组若函数形参为int ,则在函数中可以像使用数组一样使用指针,也就是说可以使用下标运算符(即方括号”)来该问 数组元素。 void f2(int :F99 pGpEEG/int G9689G9689G在函数形参中是等价的,因此对于拥有这三种形参的函数声明是相同的而不是函数重载, /若没有改变数组形参所指向的地址,则对数组形参的操作会间接的改变实能数组的值,以下操作都会改变相应的实参数组的值 void f3(int p;FpGpEG void f3(int :FG /void f3(int pF /错误,f3

12、被重定义,这里的f3函数是等价的,只能定义一个相同的函数。/多维数组形参以三维数组为例 /1、多维数组,除了第一维之外的其他维都是其元素类型的一部分,因此除第一维之外的其他维是不能省略的,以下三个声明是错误的。 /void f4(int a;FG99/void f4(int a;FG99 /void f4(int a;FG999SS错误 /2、可以使用数组表示法(即下标法)使用多维数组形参,即可以使用下标运算符(即方括号”23”)来该问数组元素。 /3、若没有改变数组形参所指向的地址,则会间接的改变传递进来的数组实参的值 /4、多维数组的形参也会被转换为指向第一个元素的指针(注意,多维数组的元

13、素仍是数组) /5、以下三个函数是完全等价的,即都与void f5(int (abc2d32e3c等价,任何两个相同的定义都是重定义错误,请读者自行验证。 void f5(int ay32d32e3cz/形参int a|32d32e3会被自动转换为int (bc2d32e3,即指向数组第一个元素a3的地址b20。 void f5(int a32d32e3cz/形参int a32d32e3会被自动转换为int (bc2d32e3,即指向数组第一个元素a3的地址b23。 void f5(int (bc2d32e3ca32323z a“3232”3”z a32323z /两种解决数组越界问题的方法

14、/1、使用第二个参数指定数组的大小,不推荐为数组形参的第一维指定大小,因为若指定大小,很容易给人以误解。 void f6(int a-int i) void f7(int a32d32e3-int i) /2、使用引用数组形参来解决数组的大小,这时实参数组的大小就必须与形参数组的大小相同。注意,引用是被引用对象的一个别名。 void f8(int (bc23c/这时需要传递一个有10个元素的数组实参 void f9(int (bc232d32e3c/这时需要接收一个形如b32d32e3的三维数组实参,且下标数值应完全相同。 /当形参为其他数组形式的转换 /函数f10的形参被转换为int abc

15、2d3,在调用该函数时,应使用与该形参类型相同的实参。即形参a是一个指向个元素的数组的指针, 且数组中的每个元素都是一个int 的指针 void f10(int b232d3ccout?;=ABCDE /输出1,2int s1HI=;J=;K=LM #include using namespace std;void f1(int i, int cout8?:;int); /赋给函数指针的函数必须和函数指针有相同的反回类型, 相同的形参列表(即形参的类型和个数要相同), 但并不要求形参的名称要一致。 因此以下赋值都是错误的。 /p3=f1;/错误,函数反回类型不同 /p4=f1;/错误,函数的形参类型不同 /p5=f1;/错误,函数的形参个数不同 /不能对函数指针进行算术运算,因此以下操作都是错误的。 /p1ii,-/p1j8k,-/p1l+, /使用函数指针调用函数 /1、可以把函数指针当函数名一样使用来调用函数,也可以把函数指针解引用之后来调用函数,这两种调用方法在逻辑上是矛盾的,但 ii都支持 p1(2,3);(8+:;k9:,-/注意,小括号不能省略 /2、因为ii

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号