版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充2.1 I/O2.1 I/O操作操作2.2 2.2 强类型机制强类型机制2.3 2.3 引用引用 2.4 2.4 内联函数内联函数2.5 2.5 指针指针2.6 2.6 操作字符串数据的标准函数库操作字符串数据的标准函数库2.7 2.7 块内的说明块内的说明2.8 new 2.8 new 和和deletedelete运算符运算符2.9 2.9 作用域访问运算符作用域访问运算符:2.10 const2.10 const的扩充作用的扩充作用2.11 2.11 函数重载函数重载2.122.12 参数个数不定的函数参数个数不定的函数第二章第二章
2、C+(非类部分非类部分)对对C的扩充的扩充 通常通常C+编译系统(例如编译系统(例如IDE)可以根据文件的)可以根据文件的扩展名来区分扩展名来区分C和和C+:是:是 .C的认为是的认为是C程序,程序, .CPP的是的是C+程序程序。 C+是是C的超集的超集,掌握,掌握C是掌握是掌握C+的先决条件。的先决条件。C+中超出中超出C的部分的部分主要是面向对象的程序设计主要是面向对象的程序设计,也,也是产生是产生C+的根由。但是的根由。但是C+非类部分对非类部分对C的语法也作的语法也作了了扩充扩充和很少的和很少的“更新更新”,例如,例如C语言允许一个全局语言允许一个全局变量多次定义,变量多次定义,C+
3、中则会引起错误。中则会引起错误。第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充2.1 I/O操作操作C+完全支持完全支持C的的I/O函数集,但函数集,但C+的的I/O类库和类库和I/O操作内容也很多,需要分阶段逐步去掌握。这里操作内容也很多,需要分阶段逐步去掌握。这里先举两个简单的实例:先举两个简单的实例: C+中的中的 out 相当于相当于C中的输入函数中的输入函数scanf()。第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充/C+中使用中使用 cin 和和cout 举例举例 main(void) char str80; coutstr; /read a string 第
4、二章第二章 C+(非类部分非类部分)对对C的扩充的扩充 C+是强类型的,在是强类型的,在C中不强制使用原型化函数,中不强制使用原型化函数,在在C+中这一要求是必须的、强制的,所有函数必须中这一要求是必须的、强制的,所有函数必须使用原型。使用原型。C+可以在函数原型中采用默认值,可以在函数原型中采用默认值, 例如:例如:fn ( int x, float y=1.0, int z=3 ); 默认的值必须从右到左敷值起,下面的例子是非默认的值必须从右到左敷值起,下面的例子是非法的:法的:fn ( int x, float y=1.0, int z); 当调用函数时,默认的值也要从右到左计算起。当调
5、用函数时,默认的值也要从右到左计算起。如果函数原型为:如果函数原型为:fn ( int x, float y=1.0, int z=3 ),则,则调用调用fn ( 1, 2 ) 相当于调用相当于调用fn ( 1, 2.0, 3)。2.2 强类型机制强类型机制第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充 引用作为对象的别名而使用,对引用的改动实际引用作为对象的别名而使用,对引用的改动实际是对对象的改动。当建立引用时,程序用另一个变量是对对象的改动。当建立引用时,程序用另一个变量或对象名字初始化它。或对象名字初始化它。 引用的声明形式为引用的声明形式为 &引用名引用名=对象名对
6、象名或或 & 引用名引用名=对象名对象名 其中:其中:(1) 引用名必须遵循变量的命名规则。引用名必须遵循变量的命名规则。 (2) 前面的数据类型就是它所引用前面的数据类型就是它所引用对象对象的数据类型。的数据类型。 引用不是值,不占存储空间,声明引用时,引用不是值,不占存储空间,声明引用时,对象对象的存储状的存储状态是不会改变的。态是不会改变的。2.3 引用引用第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充/例例2-1 EX2_1.cpp 演示演示“引用引用”的用法的用法#include iostream.hvoid swap(int &a, int &b)
7、;/a、b 定义为引用参数定义为引用参数main(void) int x1=10, x2=20; coutx1 x2n;/显示显示 10 20 swap(x1,x2);/交换所引用的变量的值交换所引用的变量的值 coutx1 x2endl;/显示显示 20 10 return 0;第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充void swap ( int &a, int &b ) int t; t=a; a=b; b=t;程序执行后的屏幕显示:程序执行后的屏幕显示:10 2020 10第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充/例例2-2 EX2_2.
8、cpp 演示演示“引用引用”的扩充用法的扩充用法#include iostream.hmain(void) int x1, x2; int &iRef=x1; /定义一个定义一个“引用引用”:使使iRef成为成为x1的别的别名名 x1=10; coutx1 iRef; /显示显示 10 10 x2=121; iRef=x2; /等效于等效于x1=x2 (不是(不是x2的地址)的地址) coutnx1endl; /显示显示 121 return 0;第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充 内联函数是在编译时将函数体嵌入在每一个调用内联函数是在编译时将函数体嵌入在每一个调
9、用语句处,节省了参数传递、系统栈的保护与恢复等的语句处,节省了参数传递、系统栈的保护与恢复等的开销。开销。内联函数的定义形式为:内联函数的定义形式为: ( 形参表形参表 ) 函数体函数体 2.4 内联函数内联函数第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充/例例2-3 EX2_3.cpp 内联函数内联函数#include #include inline int max(int a, int b)/定义内联函数定义内联函数 if ( ab ) return a; else return b;void main() int a, b, c, d; a=210; b=150; c=20;
10、 d=max(a,b); /编译时被替换为编译时被替换为max函数体语句函数体语句 d=max(d,c); /编译时被替换为编译时被替换为max函数体语句函数体语句 coutThe biggest of a b c is d;第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充 内联函数在内联函数在C+中几乎取代了中几乎取代了C的的#define宏,因宏,因为它更灵活。并且没有什么副作用。为它更灵活。并且没有什么副作用。 宏的副作用举例:宏的副作用举例:#define sqr(x) x#define sqr(x) x* *x x /定义计算定义计算x x平方的宏平方的宏int y=sqr(
11、2+3) int y=sqr(2+3) /计算计算 5 5 的平方的平方:5:5* *5=255=25 计算结果:计算结果:y=2+3y=2+3* *2+3=1125 2+3=1125 。上述错误产生后。上述错误产生后较难跟踪,使用内联函数可以避免这种隐患。较难跟踪,使用内联函数可以避免这种隐患。 注意注意 控制结构不能放在内联函数中!控制结构不能放在内联函数中!第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充2.5 指指 针针1指针的基本操作指针的基本操作 与指针有关的基本运算符有以下两个与指针有关的基本运算符有以下两个: (1) &变量名变量名 &为取地址运算符,用
12、来获取变量的首地址。为取地址运算符,用来获取变量的首地址。 (2) *指针变量名指针变量名 *为指向运算符,用来获取指针变量所指向变量为指向运算符,用来获取指针变量所指向变量的值。的值。 &和和*运算符都是单目运算符,其优先级高于所运算符都是单目运算符,其优先级高于所有双目运算符,采用从右到左的结合性有双目运算符,采用从右到左的结合性 (P33表表2-4)。第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充2const修饰符与指针修饰符与指针 const与指针在一起使用,情况比较复杂,可简单与指针在一起使用,情况比较复杂,可简单归纳为三种:指向常量的指针、常指针和指向常量的归纳为
13、三种:指向常量的指针、常指针和指向常量的常指针。常指针。(1) 指向常量的指针指向常量的指针 是一个指向常量的指针是一个指向常量的指针变变量。例如:量。例如:const char *name =chen; /声明一个名为声明一个名为name 的指针变量的指针变量name3= a; /错误,不容许改变已指向的常量错误,不容许改变已指向的常量name =zhang; /正确,可以改变指针的指向正确,可以改变指针的指向第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充(2) 常指针常指针 把指针本身声明为把指针本身声明为常常量。例如:量。例如:char *const name=chen; /声
14、明一个名为声明一个名为name的常指针的常指针name3= a;/正确,所指的数据可以改变正确,所指的数据可以改变name=zhang;/错误,不容许改变指针本身错误,不容许改变指针本身(3) 指向常量的常指针指向常量的常指针 指针本身与它所指向的数据值均不能改变,例如指针本身与它所指向的数据值均不能改变,例如:const char *const name=chen;/声明一个指向常量的常指针声明一个指向常量的常指针name3= a; /错误,不能改变指针所指的值错误,不能改变指针所指的值name=zhang; /错误,不能改变指针的指向错误,不能改变指针的指向第二章第二章 C+(非类部分非类
15、部分)对对C的扩充的扩充 C+提供了许多操作字符串数据的标准库函数,提供了许多操作字符串数据的标准库函数,如比较字符串、搜索字符串中的字符、确定字符串如比较字符串、搜索字符串中的字符、确定字符串长度等,只要我们在使用它们前在应用程序的开头长度等,只要我们在使用它们前在应用程序的开头添加包含添加包含“string.h”头文件的预处理命令头文件的预处理命令#include ,在程序设计时就可直接引用。下表总结,在程序设计时就可直接引用。下表总结了这些函数。了这些函数。 2.6 操作字符串数据的标准库函数操作字符串数据的标准库函数第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充函 数 原 型
16、 函 数 说 明 char *strcpy(char *s1 ,const char *s2) 将字符串 s2 复制到字符数组 s1 中,返回 s1 的值 char *strncpy(char *s1,const char *s2, n) 将字符串 s2 中最多 n 个字符复制到字符数组 s1 中,返回 s1 的值 char *strcat(char *s1,const char *s2) 将字符串 s2 添加到字符串 s1 后面。s2 的第一个字符覆盖 s1 的 NULL 终止符。返回 s1 的值 char *strncat(char *s1,const char *s2, n) 将字符串
17、s2 中最多 n 个字符添加到字符串 s1 后面。s2的第一个字符覆盖 s1 的 NULL 终止符。返回 s1 的值 int strcmp(const char *s1,const char *s2) 比较字符串 s1 与字符串 s2。当函数在 s1 等于、小于或大于 s2 时,分别返回 0、小于 0 或大于 0 的值 int strncmp(const char *s1,const char *s2,n) 比较字符串 sl 中的前 n 个字符与字符串 s2。当函数在 s1的前 n 个字符等于、小于或大于 s2 时,分别返回 0、小于0 或大于 0 的值 int stelen(const ch
18、ar *s) 确定字符串长度,返回 NULL 终止符之前的字符数 C+字符串处理库字符串处理库(标准库标准库)中常用的字符串操作函数中常用的字符串操作函数第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充2.7 块内的说明块内的说明 在在C+中,变量中,变量几乎几乎可以在块(一对可以在块(一对 之间)任之间)任何地方加以说明,其有效范围从说明处起一直到块的何地方加以说明,其有效范围从说明处起一直到块的末尾。末尾。 但除但除for循环外,变量不能在其它控制语句中说明。循环外,变量不能在其它控制语句中说明。下例是错误的:下例是错误的:while(int i=0) 在嵌套的在嵌套的for语句中
19、,内层要加语句中,内层要加 ,例如:,例如:for(int i=0; i=10; i+) for(int j=0; j=100; j+) 否则在编译时出错。否则在编译时出错。 一个大的软件,各个部分都应遵循同一风格。一个大的软件,各个部分都应遵循同一风格。第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充2.8 new 和和delete 运算符运算符new 和和 delete 运算符运算符用来代替用来代替函数函数 malloc( ) 和和 free( ),动态控制内存的分配和释放。,动态控制内存的分配和释放。delete 一定要配一定要配对释放用对释放用 new 分配的内存,否则会导致内
20、存泄漏、程分配的内存,否则会导致内存泄漏、程序失控。序失控。使用使用new的长处:的长处:1. malloc( )时函数,必须要用强制类型说明;而时函数,必须要用强制类型说明;而new是操作符,能自动返回正确的指针类型;是操作符,能自动返回正确的指针类型;2. New操作自动计算分配类型的长度,不须操作自动计算分配类型的长度,不须sizeof操作符。操作符。第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充2.9 作用域访问运算符作用域访问运算符 :运算符运算符 :用于访问(即分辨)全局名字(变量、对象等),用于访问(即分辨)全局名字(变量、对象等),下例说明全局变量下例说明全局变量nD
21、ata的访问方法:的访问方法:/EX2_4.cpp 演示作用域访问符演示作用域访问符:#include int nData;/全局变量全局变量void main(void) int nData=1;/局部变量赋值局部变量赋值 :nData=10;/全局变量赋值全局变量赋值 cout local nData= nDataendl; coutglobal nData=:nDataendl;第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充2.10 const的扩充作用的扩充作用const在在C+中可以用于定义一个中可以用于定义一个常常数数变变量。当一量。当一个变量定义为个变量定义为const
22、时,表示其值在说明中被赋值,编时,表示其值在说明中被赋值,编译时已固定不变。例如:译时已固定不变。例如:const int SIZE=100;char achNameSIZE;const变量的作用范围与变量的作用范围与static变量相同。变量相同。第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充2.11 函数重载函数重载用相同的函数名定义不同的功用称为函数重载。重载的函用相同的函数名定义不同的功用称为函数重载。重载的函数根据参数的个数和类型进行区分,但不能根据返回类型进行数根据参数的个数和类型进行区分,但不能根据返回类型进行区分。例如:区分。例如:第二章第二章 C+(非类部分非类部分
23、)对对C的扩充的扩充/ EX2_5.cpp : 演示函数重载演示函数重载#include void fn ( int n ) cout fn ( int ) called with nendl;void fn ( int nA, int nB ) coutfn(int, int) called with nA and nBendl;void fn (char chA ) cout fn ( char ) called with chAendl;第二章第二章 C+(非类部分非类部分)对对C的扩充的扩充void main(void) int i=1, j=2; char c=a; fn ( i );/call fn(int) fn ( i, j );/call fn(int, int) fn ( c );/call fn(char)程序运行后屏幕显示:程序运行后屏幕显示:fn( int ) called with 1fn( int, int ) called with 1 and 2fn( char ) called with a第二章第二章 C+(非类部分非类部分
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年废旧材料销售框架合同
- 文书模板-装卸货高空作业合同
- 2024年建筑工程分包合同
- 玫瑰的课件教学课件
- 2024年人工智能教育平台开发合同
- 2024医疗设备维修公司关于超声波机器保修服务合同
- 停电停气应急预案(6篇)
- 2024年建筑工程机电安装分包协议
- 2024年库房租赁与无人机测试存放合同
- 2024年专业咨询合作协议
- 中国航空协会:2024低空经济场景白皮书
- 2025年公务员考试时政专项测验100题及答案
- 部编版二年级上册-课文一-快乐读书吧:读读童话故事-孤独的小螃蟹(课件)(共26张课件)
- 人教版(2024)七年级地理上册3.2《世界的地形》精美课件
- 中国保险行业协会官方-2023年度商业健康保险经营数据分析报告-2024年3月
- GB/T 31326-2014植物饮料
- 铁路物资管理模拟考试试题
- 初中历史课堂教学如何体现学生的主体地位
- 部编版三年级上册语文课件-习作六:这儿真美---(共19张PPT)部编版
- 2020湖南湖南省建筑施工开工安全生产条件承诺书
- 先进先出(FIFO)
评论
0/150
提交评论