第二章 C++对C 在非面向对象方面的改进 更简洁,更安全.

Slides:



Advertisements
Similar presentations
C++语言程序设计教程 第5章 构造数据类型 第6章 C++程序的结构.
Advertisements

說 劍 《莊子‧雜篇》─ 第 一 組 賴泊錞 謝孟儒 張維真 羅苡芸
移动应用软件开发技术 第二讲:C++编程基础
C语言程序设计 主讲教师 :张群燕 电话:
第一章 C语言概述 计算机公共教学部.
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
C++程序设计 王希 图书馆三楼办公室.
由C程序结构所知,一个完整的C语言程序是由一个且只能有一个main()函数(又称主函数)和若干个其他函数组合而成的。而前面各章仅学习main()函数的编程,本章将介绍其他函数的编程,包括其他函数的定义、调用、参数传递及变量的作用域等。
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
C++程序设计 第二讲 清华大学软件学院.
第4章 函数与预处理 4.1 概述 4.2 定义函数的一般形式 4.3 函数参数和函数的值 4.4 函数的调用 *4.5 内置函数
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
新世纪计算机专业系列教材 数据结构 C++实现 第一章 缪淮扣 顾训穰 沈 俊 编著 科 学 出 版 社.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
程序设计期末复习 黎金宁
第三章 C++中的C 面向对象程序设计(C++).
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
第三章 类与对象 §3—1 面向对象.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
C++语言程序设计 第二章 C++简单程序设计.
C/C++/Java 哪些值不是头等程序对象
第三章 数据类型、运算符与表达式.
第六章 指针、引用和动态空间管理 6.1 指针的概念 指针的概念 指针变量的定义和初始化
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
C++大学基础教程 第3章 C++控制语句 北京科技大学 信息基础科学系.
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
第 二 章 数据类型、运算符与表达式.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C语言复习2----函数.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C语言程序示例: 1.输入10个数,按从小到大的顺序排序。 2.汉诺塔问题。.
第10讲 构造函数和析构函数 构造函数 析构函数 This 指针.
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
第六章 指针 C++程序设计中使用指针可以: 使程序简洁、紧凑、高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
第三章 数据抽象.
第十章 指针 指针是C语言的重要概念,是C语言的特色,是C语言的精华。 10.1 地址和指针的概念 内存中的每一个字节都有一个地址。
C程序设计.
C语言程序设计 李祥 QQ:
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第2章 数据类型、运算符与表达式 本章要点: 基本数据类型 常量和变量 算术运算符和算术表达式 关系运算符和关系表达式
面向对象技术 练习 ffh.
第二章 类型、对象、运算符和表达式.
C++程序设计基础 主讲人:谢昕 华东交通大学信息工程学院 第十~十二讲 多态性和虚函数 2005年春季学期.
第二讲 基本数据类 型及数组等 此为封面页,需列出课程编码、课程名称和课程开发室名称。
第1章 C++面向对象程序设计要点 1.1 函数和函数参数 1.2 输入输出   1.3 类 1.4 抽象类型和模板.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
谭浩强编著 C++面向对象程序设计 授课教师:姬广永 学习网站:
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
第三章 高级函数特性.
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
第二章 Java基础语法 北京传智播客教育
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

第二章 C++对C 在非面向对象方面的改进 更简洁,更安全

一、注释符 注释的用途: ① 提高可读性 ② 调试程序时屏蔽暂时不用的代码 ③ 生成文档 C:/*……*/ 多行(块)注释分界符号,可出现在空格可出现的任何地方,通常不能嵌套 C++:// …… 单行注释符,到本行末尾结束

习惯: ① 为提高通用性,常用英语写注释 ② 注释是为了完善你的代码,而不是重复你的代码,没有额外价值的注释不如不加 ③ 因不同编译器对嵌套注释(调试时,屏蔽一段带注释的代码) 处理不同,有的不支持,故注释不要嵌套

二、变量初始化运算符:( ) C:int x=2; C++:int x(2); 例: 非法:int x; x(2); 合法:int x(2),y,z(3);

三、新的换行符:endl C:" \n " 转义字符 C++:endl (end of line)

四、新的I/O流 C: 库函数:scanf("%d",&x); printf("%d",x); 效率低,不安全。 它们在头文件stdio.h中定义

C++:I/O流:cin>>x; cout<<y; cin:是标准输入流类istream类预定义的对象引用 >>:提取符,是istream类中重载的运算符,可以连用 cout:是标准输出流类ostream类预定义的对象引用 <<:插入符,是ostream类中重载的运算符,可以连用 它们都在头文件"iostream.h"中定义

例1: scanf("%d%d%d",&x,&y,&z); //cin>>x>>y>>z; printf("%d%d%d",x,y,z); //cout<<x<<y<<z; 例2: #include "iostream.h" void main( ) {int x=25; cout<<hex<<x<<dec<<x<<oct<<x<<endl; } 结果:192531

例3:#include "iostream.h" void main( ) {int x=25; cout<<x<<hex<<x<<x<<endl;//251919 cout<<x<<oct<<x<<x<<endl; //193131 cout<<"x+5 is:"<<x+5<<endl;//x+5 is:36 } 格式: cin>>变量名 cout<<变量名、表达式、字符串常量 应注意运算符的优先级,必要时应加括号

五、灵活的局部变量说明 C:局部变量说明必须置于可执行代码段之前 习惯:较短函数中局部变量常集中在函数的开始处说明,较长函数中常在使用处定义局部变量

例: # include "iostream.h" void main( ) {int x=1; if(int x=2)x=3; else x=4; cout<<x<<endl; } 结果:1

例: #include <iostream.h> void main( ) {int x=1; if(x>0) int x=3; if(x>2)x=5; cout<<x<<endl; } 结果:1

例: #include "iostream.h" void main( ) {int x=1; if(x>2) int x=5; else int x=0; cout<<x<<endl; } 结果:1

例: #include "iostream.h" void main( ) {int y=1; for(int x=0; x<3; x++) int y=4; cout<<y<<endl; } 结果:1

例: #include "iostream.h" void main( ) {int x=5, y=4; switch(int x=y%2) {case 0: case 1:cout<<x<<endl; } cout<<x<<endl; 结果:0,5

例: #include "iostream.h" void main( ) {int x=1; if(x>2) int x=5; else x=0; cout<<x<<endl; } 结果:0

例: #include "iostream.h" void main( ) {int x=1; if(x>2) x=5; else int x=0; cout<<x<<endl; 结果:1

六、结构、联合、枚举名和类名可直接作为类型名 C: 结构名、联合名、枚举名须加上各自的关键字才是类型名 在定义变量时,须在结构名、联合名、枚举名前冠以关键字struct、union、enum C++: 结构名、联合名、枚举名、类名本身就是类型名,在定义变量时,不必在其前加struct、union、enum、class

例: enum bool{FALSE ,TRUE}; struct student {char * name; int age; }; C: enum bool b1,b2; struct student s1,s2; C++: bool b1,b2; student s1,s2;

七、const修饰符: 只读 符号常量的优点: ① 提高可读性:见名知义 ② 便于修改程序:一改全改 C: #define LIMIT 60 符号常量,不安全,无参的宏,不占用存储空间

C++: const int LIMIT=60; 占内存,只读变量,能进行类型检查,更安全,定义时必须同时初始化 const修饰指针: ① 指向常量的指针:const类型符 * 指针名=值;//指针所指对象被冻结 ② 常指针:类型符 * const 指针名=值; //指针被冻结 ③ 指向常量的常指针:const类型符 * const 指针名=值; //指针及指针所指对象均被冻结

例1: ① const char * p="book"; 则:p[3]='t'; (×) p="good"; (√) ② char * const p="book"; 则:p[3]='t'; (√) p="good"; (×) ③ const char * const p="book"; 则:p[3]='t'; (×) p="good"; (×)

例2: # define AGE1 18 (√) const int AGE1=18; (√) # define AGE2 18.45 (√) const int AGE2=18.45; (×)

const常量作函数的形参: 若在定义函数时,只允许函数体访问(读)形参变量的值,不允许修改(写)它的值,则在形参变量定义的前面加上const 例:void fun(const int & x,const int & y) 则:x++,y++均非法 目的:提高数据的安全性

例3: # include "iostream.h" void main( ) {int a=2; # define A a+a # define B A-A // a+a-a+a cout<<3*B<<endl; } //3*a+a-a+a=3*2+2-2+2 结果:8

# include "iostream.h" void main( ) {int a=2; const int A=a+a; //A=4 const int B=A-A; //B=0 cout<<3*B<<endl; }//3*((a+a)-(a+a))=3*((2+2)-(2+2)) 结果:0

例:判断下列程序段的正误 ①int f(const int x) {return x+1;} (√) ②int f(const int x) {return ++x;} (×) ③const int x; x=5; (×)

例:判断下列程序段的正误 ①const int x=5; x=x+3; (×) ②const int x=5; const int *p=&x; *p=6; (×) ③int x=5; int * const p=&x; *p=6; (√)

④int x=6,y=7; int * const p=&x; p=&y; (×) ⑤const int x=5; const int * const p=&x; * p=10; (×)

⑥int x=6,y=7; int * const p=&x; * p=y; (√) ⑦const int x=5; const int y=6; const int * p=&x; p=&y; (√)

八、内联函数 C: 宏替换(带参数的宏),无类型检查机制,不安全 C++: 内联函数,编译时用函数的函数体来替代函数调用表达式,能加快代码执行,减少调用开销

定义: ① 在普通函数的定义前加inline ② 凡是在类的类体中实现的成员函数都是内联函数 注意: ① 内联函数内不允许有循环语句和开关语句,否则当普通函数处理 ② 内联函数通常适用于短函数 ③ 它是以目标代码的增加为代价来换取运行时间的节省

例:# include "iostream.h" # define mul(x) x*x void main( ) {cout<<mul(2+3)<<endl; //2+3*2+3 cout<<mul(0.2+0.3)<<endl; //0.2+0.3*0.2+0.3 } 结果:11 0.56

# include "iostream.h" inline int mul(int x) {return x*x;} void main( ) {cout<<mul(2+3)<<endl; //cout<<mul(0.2+0.3)<<endl;非法 } 结果:25

例:inline int cube (int n) {return n*n*n;}

函数: ① 减少目标代码,实现程序代码和数据的共享,代码复用 ② 让使用者只关心函数的功能和用法,不必关心其实现,减少了用户的负担,屏蔽实现细节 ③ 函数调用浪费时间浪费空间(保护现场,恢复现场),故它是以降低效率为代价的

内联函数: ① 用替换代替调用,从而提高效率,用空间换时间 ② 内联函数的定义,必须出现在对其调用之前 ③ 内联函数不能递归调用,其中不能定义静态变量和数组

九、函数原型 C: 函数提前声明(先使用后定义),即函数首部(函数头)

C++:函数原型 ① 提供函数的函数名及函数返回值类型,以及形式参数的个数、类型和次序 ② 参数表中的参数允许只给类型而省去参数名,在函数原型最后应加分号 ③ 任何函数均应提供函数原型(除先定义,后使用者外) ④ 形参说明必须放在函数名后的括号内,不能放于函数首部与函数体之间

例: double f(int x,char y,float z) {return x+y+z;} 则其函数原型为: double f(int x,char y,float z); 或double f(int , char , float);

十、带有缺省(默认)参数值的函数 C: int x=2; 变量可带缺省(默认)值

C++:允许函数的形参变量带缺省值(默认值) 实质为函数重载的另一种形式,提高了函数调用的灵活性 函数调用时,编译器按从左至右的顺序将实参与形参变量匹配 当实参个数不够时,则采用形参缺省值来补足所缺实参 所有取缺省值的形参都必须出现在不取缺省值的参数的右边 当函数有原型时,形参的缺省值应在函数原型中声明,即缺省参数的说明,必须出现在函数调用之前

例: int add(int x=1,int y=2,int z=3) {return x+y+z;} 若int m=add( ); 则m=6 若int n=add(10); 则n=15 若int k=add(10,20); 则k=33 若int i=add(10,20,30); 则i=60 若int j=add( , ,30); 则非法

若某缺省参数需指明一个特定值,则在其左边的所有参数都必须赋值 例: int f(int x=1,int y=2,int z); (√) int f(int x,int y=1,int z=2); (×) int f(int x=1,int y,int z=3); (×) int f(int x,int y=2,int z); (×)

对形参缺省值的指定可以是任意初始化表达式,甚至可以包含函数的调用 例:# include "iostream.h" int a(8),b(7); void f(int x,int y=a+b,int z=a-b); void main() {f(10); f(20,30); f(40,50,60); } void f(int x,int y,int z) {cout<<x<<y<<z<<endl;} 结果: 10151 20301 405060

在相同的作用域内,默认形参值的说明应保持唯一 在不同的作用域内,允许说明不同的默认形参 例:# include "iostream.h" void f(int x=1,int y=2);//全局默认形参值 void g( ){f( );} void main( ) {void f(int x=3,int y=4);//局部默认形参值 f( ); g( ); } void f(int x,int y) {cout<<x<<y<<endl;} 结果: 34 12

十一、函数重载 C: 不允许函数同名,不同作用域或生存期的两变量可以同名

C++: 在一定条件下允许函数同名,即重载 重载:一个标识符具有两个或两个以上的意义 它在任一特定环境下所表述的意义还必须由其所处的上下文环境来决定 包括函数重载、运算符重载等

函数重载:同一个函数名字对应着多个不同的函数实现 当两个或两个以上普通全局函数的形参个数、类型和顺序不完全相同时,它们可以同名 当同一个类的两个或多个成员函数的形参个数、类型和顺序不完全相同时,它们可以同名 同名函数根据参数个数或类型或顺序来区分 普通全局函数与类的成员函数之间可以同名 基类(父类)成员函数和派生类的成员函数之间也可同名 同名函数根据对象名或类名来区分

函数重载目的: 同一个函数调用语句可以绑定(联编)于不同的函数体,实现了代码共享 使程序员摆脱词汇(名字空间,命名冲突)的复杂性,增加了程序的可读性 习惯:重载函数应完成相同或相似的功能

例: ① int f(int x) {return x+1;} ② double f(double x) {return x+1;} ③ char f(char x) 则: cout<<f(3); //调① cout<<f(3.3); //调② cout<<f('a'); //调③

例:① int add( ) {return 0;} ② int add(int x) {return x;} ③ int add(int x,int y) {return x+y;} 则: cout<<add( ); //调① cout<<add(3); //调② cout<<add(3,4); //调③

例:下列函数能重载吗? ① int f(int x); int f(int y); (×) ② int f( ); double f(); (×) ③ int f(int x,char y); int f(int y,char x); (×) ④ int f(char x,int y); int f(int y,char x); (√)

⑤ int f(int x,int y=1); int f(int x); (×) ⑥ int f(char x,int y=1); int f(int x); (√) ⑦ int f(int x); int f(int & x); (×) ⑧ void f( ); void f( )const; (√)

重载函数的选择顺序: 将实参与形参一一比较 ① 先查找参数严格匹配的,若找到,就调用之,否则 ② 再通过自动隐式类型转换查找参数匹配的,若找到就调用之,否则 ③ 最后通过用户定义的强制类型转换查找参数匹配的,若找到就调用之,否则显示函数调用错误

例:① void f(int); ② void f(int,int); ③ void f(double); ④ void f(double, double); 则: f(1); // 匹配① f(2.5); // 匹配③ f(2,3); // 匹配② f('A'); // 匹配① f((double)4); //匹配③ f('B','C'); //匹配② f('D',2.5); //匹配④ f(5,2.5); //匹配④ f(); //调用失败,出错 f(1,2,3.5); //调用失败,出错

十二、作用域运算符 :: 在内层作用域中,外层作用域中声明的同名标识符是不可见的 十二、作用域运算符 :: 在内层作用域中,外层作用域中声明的同名标识符是不可见的 C:当局部量与全局量同名时,在局部量的作用域内,全局量被屏蔽(隐藏),不可见 C++:可通过作用域运算符改变全局量的可见性

例:# include "iostream.h" int x=5; void main() { int x=10; x=20; ::x=30; cout<<x<<::x<<endl; } 结果:20 30

例:# include "iostream.h" int s=1; void main() {double s=2.2; { :: s=5; cout<<s<<endl; s=10; } 结果:2.2 10

例:# include "iostream.h" int a=1; void main() {int a=2; {int a=3; ::a=4; } cout<<a<<::a<<endl; 结果: 24

例:# include "iostream.h" int a=1; void main() {int a=2; {int a=3; cout<<a<<::a<<endl; } 结果:31 21

例:# include "iostream.h" int a=1; void main() {int a=2; { a=3; ::a=4; } cout<<a<<::a<<endl; 结果: 34

例:# include "iostream.h" int a=1; void main() {a=2; {int a=3; ::a=4; } cout<<a<<endl; 结果: 4

十三、类型转换函数 1.C (1)隐式类型转换: ① 不同类型量混合运算:低→高 ② 赋值语句: 右→左 ③ 函数实参→形参 ④ 函数返回值→函数类型 (2)显式类型转换:强制类型转换运算符 (类型符)(表达式) 或(类型符)表达式

2.C++ 类型转换函数→目标类型符作函数名,提高了可读性 类型符(表达式)

例: ① float i=-2.8; int j=int(i); 则j=-2 i=-2.8 ② float i=2.8; int j=int(i); 则j=2 i=2.8 ③ float i=-1.5; int j=(int)(i); 则j=-1 i=-1.5 结论: 向零取整:取与它最接近的且靠近0那边的那个整数 或截尾:直接去掉小数点后面的所有数据

十四、new和delete运算符 C:库函数 malloc( ) 动态分配内存 free( ) 动态释放内存 效率低 C++:运算符 更好,更简单,两运算符均可重载

指针名=new 类型符; 从内存堆中分配一块sizeof(类型符)字节大小的内存,其首址存于指针中 delete 指针名; 释放new分配的存储空间 为数组动态分配和释放内存: 指针名=new 类型符[大小][大小]……; delete [ ] 指针名;

例:# include "iostream.h" void main() {int * p,* q; p=new int; q=new int(100); *p=10; cout<<*p<<*q<<endl; delete p; delete q; } 结果:10100

例:# include "iostream.h" int main() {int * p=new int[10]; if(!p) {cout<<"allocation failure.\n"; return 1; //程序出现异常情况 } p[2]=20; p[3]=30; cout<<p[2]+p[3] <<endl; delete [ ] p; return 0; //程序运行过程中没有出现错误 结果: 50或allocation failure.

指针悬挂: 语句p=q; 使p原来指向的空间再也无法访问,且不能被释放,即为无用单元 语句delete p; 还会导致两次释放同一块存储空间

例:# include "iostream.h" int main() {int * p=new int(1); int * q=new int(2); cout<<*p<<*q<<endl; //12 p=q; cout<<*p<<*q<<endl; //22 delete p; delete q; } 结果: 12 22 运行时出问题

例:# include "iostream.h" void main() {int * p=new int(1); int * q=new int(2); cout<<*p<<*q<<endl; //12 *p=*q; cout<<*p<<*q<<endl; //22 delete p; delete q; } 无指针悬挂

例:# include "iostream.h" # include "string.h" void main() {char *p=new char[10]; char *q=new char[10]; strcpy(p,"abcd"); strcpy(q, "efgh"); cout<<p<<q<<endl; //abcdefgh p=q; cout<<p<<q<<endl; //efghefgh delete[]p; delete[]q; } 有指针悬挂问题

例:# include "iostream.h" # include "string.h" void main() {char *p=new char[10]; char *q=new char[10]; strcpy(p,"abcd"); strcpy(q, "efgh"); cout<<p<<q<<endl; //abcdefgh strcpy(p,q); cout<<p<<q<<endl; //efghefgh delete[]p; delete[]q; } 无指针悬挂问题

例:# include "iostream.h" void main() {int *p=new int(2); int *q;q=p; cout<<*p<<*q<<endl; //22 delete p;p=0; //*q=3; //cout<<*q<<endl; } 指针悬挂引用

例:# include "string.h" # include "iostream.h" void main() {char *p=new char[10]; strcpy(p,"abcd"); char *q; q=p; cout<<p<<q<<endl; //abcdabcd delete[]p;p=0; //*q='e'; //cout<<q<<endl; } 指针悬挂访问

十五、引用 C:指针 int * p=&a; 通过地址间接访问某个变量,作函数参数时可实现双向传递,不拷贝副本 C++:引用 通过别名直接访问某个变量,它是另一个变量的别名,类似于共用体(联合)

引用必须初始化,且一旦初始化后不得再作其他变量的别名 格式:类型符 & 引用名=已定义的同类型变量 主要用作函数的参数或函数的返回值,实现双向传递功能 引用传别名,指针传地址 返回引用的函数,其函数调用可作赋值语句的左值 目的:在函数间传递数据

例:# include "iostream.h" void main( ) {int a=3; int & b=a; cout<<a<<b<<endl;//33 b=5; cout<<a<<b<<endl;//55 }

例1:# include <iostream.h> void main() {int x=24; int & y=x; cout<<x<<y<<endl;//24 24 y=46;x=y+3; cout<<x<<y<<endl; //49 49 cout<<&x<<&y<<endl; //同 } //例:0x0065FD4 0x0065FD4

例2:# include <iostream.h> void main() {int a [5]={10,20,30,40,50}; int * p=a; int * & r=p; //r是p的引用,p和r均指向a[0]元素 cout<<*p<<*r<<endl; //*p和*r都表示对象a[0] 1010 p++; r++; cout<<*p<<*r<<endl; //*p和*r表示对象a[2] 3030 }

例3:# include "iostream.h" void main( ) {int a=3,*p; int & b=a; p=&b;cout<<b<<*p<<endl; //33 b=10; *p=20; cout<<a<<b<<endl;//2020 }

例:# include "iostream.h" void swap(int * m,int &n ) {int t; t=*m;*m=n;n=t; } void main() {int a=5,b=10; swap(&a,b); cout<<a<<b<<endl; //105

例: # include <iostream.h> int a[ ]={1,3,5,7,9}; int & f(int i) {return a[i]; } void main( ) {f(2)=10; cout<<a[2]<<f(2)<<endl;//1010 }

例:# include <iostream.h> int & max(int & x,int & y) {return (x>y)?x:y;} void main( ) {int a=5,b=10; max(a,b)=20; cout<<a<<b<<endl;//520 }

例:# include <iostream.h> int & f(int & m) {m+=1; return m;} void main( ) {int k=10; int &n=f(k); cout<<k<<endl; //11 n=20; cout<<k<<endl; //20 }

例:# include <iostream.h> int & g(int * p) { return *p;} void main( ) {int a=10; cout<<g(&a)+10<<endl; //20 g(&a)=100; cout<<a<<endl; //100 }

例:# include <iostream.h> int & f( ) {static int i=1; return ++i;} int g() {int j=1; return ++j;} void main( ) {int & a=f(); int b=g(); cout<<a<<b<<endl; //22 a=10; b=10; a=f(); b=g(); cout<<a<<b<<endl; //112 }

例:# include "iostream.h" void main( ) {int a=100; int & b=a; cout<<b<<endl; //100 b=b-80; cout<<a<<endl; //20 a=a+30; cout<<b<<endl; //50 }

在定义返回引用的函数时,不能返回该函数内的局部变量 原因:当函数返回时,局部变量自动消失(生存期结束,自动释放内存) 例:① int f( ) {int x=5; return x; } //(√) ② int & f( ) {int x=5; return x; } //(×) ③ int & f(int x) {return x;} //(×)

④ int * f(int & x) {return & x;} //(√) ⑤ int & f(int & x) {return x;} //(√) ⑥ int & f(int * p) {return * p;} //(√) ⑦ int f(int & x) ⑧ int & f( ) {static int x=5; return x; } //(√)

例:# include "iostream.h" void f(int a,int & b) {a=a+10; b=b+10; cout<<a<<b<<endl;//1215 } void main( ) {int x=2,y=5; f(x,y); cout<<x<<y<<endl;//215

例:# include "iostream.h" void main( ) {int a=1; int & b=a; int c=2; b=c; cout<<a<<b<<endl;//22 c=3; }

例:# include "iostream.h" void main() {int a=1; int &b=a; int c=2; b=c; b=3; cout<<a<<b<<c<<endl; //332 }

例:# include "iostream.h" void main() {int * a; int * & p=a; int b=80; p=&b; cout<<*a <<endl; //80 }

例:# include "iostream.h" void main( ) {int a=5; int * p=&a; int *&q=p; *q=10; cout<<a<<endl;//10 }

例:# include "iostream.h" void main( ) {int a=5; int & b=a; int & c=b; c=10; cout<<a<<endl;//10 }

例:# include "iostream.h"// VC++上无法通过 void main( ) {const int a=5; int & b=a; //当引用的初值是一常量或常变量时,系统将先生成一个临时变量,再赋给引用名,即引用是临时变量的别名 cout<< b<<endl;//5 b=b+20; cout<<a<<b<<endl;//5 25 }

例:# include "iostream.h" //VC++上无法通过 void main() {const int a=5; int &b=a; int &c=b; ++b; cout<<a<<b<<c<<endl; //566 ++c; cout<<a<<b<<c<<endl; //588 }

十六、无名联合 即没有名字的联合,可直接使用其成员名

例:# include "iostream.h" static union {int x; int y; }; void main() {x=3; y=4; cout<<x<<y<<endl; } 结果:44

例: # include "iostream.h" void main() {union {int a; int b; }; a=5; b=7; cout<<a<<b<<endl; //77 a=10; cout<<a<<b<<endl; //1010 }

例:# include <iostream.h> void main() {union {int x; int y; }; x=5; y=7; int & z=x; cout<<x<<y<<z<<endl; } 结果:777

例:# include <iostream.h> void main() {union{int x; int y; }; int & z=x; z=9; cout<<x<<y<<z<<endl; } 结果:999