




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章C++语言对C语言的扩充2.1C++的特点2.2C++语言的文件扩展名2.3注释符2.4名字空间2.5C++语言的输入输出2.6变量的定义2.7强制类型转换2.8动态内存的分配与释放2.9作用域运算符::2.10引用2.11const修饰符2.12字符串2.13C++语言中函数的新特性习题2.1C++语言的特点
C++语言保留了C语言的有效性、灵活性、便于移植等特点,又添加了面向对象编程的支持。编写出的程序具有结构清晰、易于扩充、程序可读性好,生成的代码质量高,运行效率仅比汇编语言慢10%~20%。2.2C++语言的文件扩展名
C++语言体系规定用“.cpp”作为C++语言源文件的扩展名以区别于C语言用的“.C”文件扩展名。
C语言用的头文件(扩展名“.h”)在C++语言中仍然保留,标准C++语言的头文件是没有.h的
。2.3注释符
1.段注释:/*…*/2.单行注释://当只做单行注释时便可用“//”符号表示从此符号起至行尾均为行注释内容。
3.程序编译时将忽略所有的注释内容。2.4名字空间(namespace)
C++语言中的名字空间是一种描述逻辑分组的机制。如果有一些声明按照某种准则在逻辑上属于同一个集团,就可以将它们放在同一个名字空间,并以关键字namespace开头给它起一个名字:namespacens1{floata,b,c;fun1(){……}}标准C++库中的所有组件都是在一个被称为std的名字空间中声明和定义的。使用标准C++库中的组件,只要写一个using指示符:
usingnamespacestd;
就可以直接使用标准C++库中的所有成员。
注意:如果使用了名空间std,则在使用#include编译预处理命令包含头文件时,必须去掉头文件的扩展名.h,否则会出错。2.5C++语言的输入输出cout<<“输出内容”<<…;
//cout为标准输出流对象(默认输出到显示器)cin>>“输入内容”>>…;
//cin为标准输入流对象(默认从键盘输入)#include<iostream.h>或#include<iostream>usingnamespacestd;【例2.1】C++的输入输出举例。#include<iostream>//使用名空间std,则必须去掉.h扩展名usingnamespacestd;voidmain(){charname[10];
intage;
cout<<"pleaseinputyourname:";
cin>>name;
cout<<"Howoldareyou:";
cin>>age;
cout<<"nameis"<<name<<endl;
cout<<"ageis"<<age<<endl;}2.6变量的定义
C++在变量的定义上作了两种较大的改变。一、允许变量的定义语句可以出现在程序的任何位置,增强程序的可读性。二、允许直接使用结构体名定义变量。【例2.2】C++的变量定义举例。#include<iostream>usingnamespacestd;voidmain(){ structstudent {
intno; floatmath; };
intn;
cin>>n; studentwang;
wang.no=n;
cin>>wang.math;
cout<<wang.no<<""<<wang.math<<endl;}2.7强制类型转换格式:(数据类型)(表达式)数据类型(表达式)通过强制类型转换,得到一个所需类型的中间值。原来表达式的值类型并未改变。如下列代码段:int
b;floatf;f=float(b);2.8动态内存的分配与释放1.new运算符
指针变量=new数据类型;new从堆内存中为程序分配可以保存某种类型数据的一块内存空间,并返回指向该内存的首地址,该地址存放于指针变量中。
2.delete运算符运算符delete用于释放new分配的内存空间,它的使用形式为:delete指针变量;其中的指针变量保存着new动态分配的内存的首地址。3.注意:用new获取的内存空间,必须用delete进行释放;#include<iostream>usingnamespacestd;voidmain(){
int*p;p=newint;//分配内存空间*p=5;
cout<<*p;deletep;//释放内存空间
}【例2.3】new与delete应用举例。在用new分配内存的同时进行初始化。使用形式为:指针变量=new数据类型(初始值);例如上例中的:p=newint; *p=5;也可写成:p=newint(5);指针变量=new数据类型[数组大小];此时指针变量指向第一个数组元素的地址。使用new分配数组时,不能提供初始值。使用new建立的数组变量也由delete释放。其形式为:delete指针变量;或delete[]指针变量;4.用new建立数组类型的变量有时并不能保证一定可以从堆内存中获得所需空间,当不能成功地分配到所需要的内存时,new返回0,即空指针。因此我们可以通过判断new的返回值是否为0,来得知系统中是否有足够的空闲内存来供程序使用。例如:int*p=newint[100];if(p==0){cout<<"can’t,allocate,moreemory,terminating.”<<endl;exit(1);}其中exit函数的作用是终止程序运行。#include<iostream>usingnamespacestd;voidmain(){intn;//定义数组元素的个数
int*p;
cout<<"pleaseinputthelengthofthearray:";
cin>>n;
p=newint[n];
【例2.4】从堆内存中获取一个整型数组,赋值后并打印出来。
if(p==0){cout<<"can'tallocatemorememory,terminating."<<endl;exit(1);}//分配内存空间
for(inti=0;i<n;i++)p[i]=i*2;
cout<<"Nowoutputthearray:"<<endl;for(i=0;i<n;i++)
cout<<p[i]<<"";
cout<<endl;delete[]p;//释放内存空间}2.9作用域运算符::
通常情况下,如果全局变量与局部变量同名,那么局部变量在其作用域内具有较高的优先权。
C语言规定只能在变量的作用域内使用该变量,不能使用其他作用域中的变量。在C++中,提供了作用域运算符::,它能指定所需要的作用域。
#include<iostream>usingnamespacestd;floata=2.4;//全局变量voidmain(){inta=8;//局部变量
cout<<a<<endl;
cout<<::a<<endl;//::a表示全局作用域中的变量a}2.10引用引用是C++语言的一个特殊数据类型描述,使用两个以上的变量名指向同一地址,被声明为引用类型的变量名则是实际变量名的别名。引用运算符为&,声明引用的一般形式为:数据类型&引用变量名=变量名;或数据类型&引用变量名=变量名;或数据类型&引用变量名=变量名;对引用进行操作,实际上就是对被引用的变量进行操作。引用不是值,不占存储空间,【例2.5】引用举例。#include<iostream.h>voidmain(){intnum=50; int&ref=num;
ref+=10;
cout<<"num="<<num<<endl;
cout<<"ref="<<ref<<endl;num+=40;
cout<<"num="<<num<<endl;
cout<<"ref="<<ref<<endl;}说明:(1)在一行上声明多个引用型变量(函数)名时,要在每个变量(函数)名前都冠以“&”符号。(2)在程序中对引用的存取都是对它所引用的变量的存取。(3)一个变量被声明为引用时必须进行初始化,除非这个引用是用作函数的参数或返回值,为引用提供的初始值应为变量(包括对象)。(4)引用一旦被初始化,就以对应目标的内存单元地址作为自己的地址,并且不再改变。(5)引用与指针不同。指针的内容或值是某一变量的内存单元地址,指针是个变量,可以把它再赋值成其它的地址。(6)要注意区分引用运算符和地址运算符的区别。例如:intnum=50;int&ref=num;int*p=&ref;(7)可以用一个引用初始化另一个引用。例如:intnum=50;int&ref1=num;int&ref2=ref1;ref2=100; //num被修改为100其中ref2也是对num的引用。(8)可以把函数的参数说明成引用,建立函数参数的引用传递方式。【例2.8】数值交换举例。2.11const修饰符#definePI3.1415926constfloatPI=3.1415926;这个常量是有类型的,它有地址,可以用指针指向这个值,但不能修改它。C++建议用const取代#define定义常量。
注意:
(1)使用const修饰符定义常量时,必须初始化;
(2)常量一旦被定义,在程序中任何地方都不能再更改。
(3)如果用const定义的是一个整型常量,int可以省略。
(4)与#define定义的常量有所不同,const定义的常量可以有自己的数据类型,这样C++编译程序可以进行更加严格的类型检查,具有良好的编译时的检测性。
(5)函数参数也可以用const说明,用于保证实参在该函数内部不被改动。例如,通过函数max求出整型数组a[100]中的最大值,函数原型应该是:
intmax(constint*pa);
这样做的目的是确保原数组的数据不被破坏,即在函数中对数组元素的操作只许读,不许写。const与指针一起使用的组合情况:(1)指向常量的指针
指向常量的指针是指一个指向常量的指针变量。
constchar*pc="abcd";声明指向常量的指针变量pc,它指向一个字符串常量;由于使用了const,不允许改变指针所指的常量,因此以下语句是错误的:pc[3]='x';但是可以改变pc的值。例如以下语句是允许的:pc="jkkk";const与指针一起使用的组合情况:(2)常指针常指针是指指针本身,而不是它指向的对象声明为常量。例如:char*constpc="abcd";//常指针这个语句的含义为:声明一个名为pc的指针变量,该指针是指向字符型数据的常指针,用“abcd”的地址初始化该常指针。创建一个常指针,就是创建不能移动的固定指针,但是它所指的数据可以改变。例如:pc[3]='x';//合法pc="dfasdfa";//不合法const与指针一起使用的组合情况:(3)指向常量的常指针整个指针本身不能改变,它所指向的值也不能改变。要声明一个指向常量的常指针,二者都要声明为const。例如:constchar*constpc="abcd";//指向常量的常指针这个语句的含义为:声明一个名为pc的指针变量,它是一个指向字符型常量的常指针,用“abcd”的地址初始化该指针。以下两个语句都是错误的:pc[3]='x';//错误,不能改变指针所指的值pc="dfasdfa";//错误,不能改变指针本身2.12字符串
在C语言中使用字符数组和字符指针实现字符串,但是在C++中提供了一种既方便又好用的string类型。下面通过一个简单的例子说明string类型的使用。【例2.10】字符串类string的使用。
#include<iostream>#include<string>//使用字符串类型的程序应包含头文件<string>usingnamespacestd;voidmain(){cout<<"请输入一个字符串:"<<endl;strings,t;
cin>>s;或getline(cin,s);//由键盘输入一行文本,并把它赋予sring类型的变量st="Ilikeprogramming!";
cout<<"字符串的输出:"<<endl;
cout<<s<<endl<<t<<endl;}2.13C++语言中函数的新特性2.13.1
函数原型(FunctionPrototype)2.13.2
内联(inline)函数2.13.3
带缺省参数的函数2.13.4
函数重载(overload)2.13.5
函数模板(functiontemplate)C++要求为每一个函数建立原型,用以说明函数的名称、参数个数及类型和函数返回值的类型。应养成将声明与定义分别编写的编程习惯。在写函数原型时,可以省略形参的名字,但如果取名恰当,这些名字可以起到提示参数用途的作用。2.13.1函数原型(FunctionPrototype)2.13.2 内联(inline)函数在执行程序过程中如果碰到函数调用,系统要进行虚实结合,同时转到函数的代码处去执行函数体语句,使得程序执行效率降低。为了解决这个问题,C++引入了内联函数机制。使用内联函数(用inline说明)是一种用空间换时间的措施,通常只有较短的函数才定义为内联函数,对于较长的函数最好作为一般函数处理。【例2.11】内联函数的使用。#include<iostream>usingnamespacestd;inlinedoublecircumference(doubleradius);voidmain(){doubler=3.0,s;s=circumference(r);
cout<<"thecircumferenceis"<<s<<endl;}inlinedoublecircumference(doubleradius)//内联函数的定义,此处也可以省略inline关键字{return2*3.1415926*radius;}2.13.3 带默认参数的函数如果在函数说明或函数定义中为形参指定一个默认值,则称此函数为带默认参数的函数。如果函数有多个默认参数,则默认参数必须是从右向左连续定义,并且在最右边一个默认参数的右边不能有未指定默认值的参数。voidfun(inta=3,intb=6,intc,intd);voidfun(inta=65,intb=3,intc,intd=3);需要特别注意的是如果在函数原型的声明中设置了函数参数的默认值,则不可再在函数定义的头部重复设置,否则编译时将出现错误信息。2.13.4 函数重载(overload)C++编译系统允许为两个或两个以上的函数取相同的函数名,但是形参的个数或者形参的类型不应相同,编译系统会根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这就是所谓的函数重载。【例2.12】重载函数应用举例【例2.12】重载函数应用举例#include<iostream.h>int
add(int
x,inty){intsum;sum=x+y;returnsum;}int
add(int
x,int
y,intz){intsum;sum=x+y+z;returnsum;}voidmain(){int
a,b;a=add(5,10);b=add(5,10,20);
cout<<”a=”<<a<<endl;
cout<<”b=”<<b<<endl;}在使用重载函数时要注意:①不可以定义两个具有相同名称、相同参数类型和相同参数个数,只是函数返回值不同的函数。int
func(intx);floatfunc(intx);②如果某个函数参数有缺省值,必须保证其参数缺省后调用形式不与其它函数混淆。int
f(inta,floatb);voidf(inta,floatb,intc=0);函数调用语句:f(10,2.0);具有二义性,既可以调用第一个函数,也可以调用第二个函数。2.13.5 函数模板(functiontemplate)
C++语言中可以使用模板来避免在程序中多次书写相同的代码。所谓模板是一种使用无类型参数来产生一系列函数或类的机制。模板分为函数模板和类模板,函数模板可以定义一个对任何类型变量进行操作的函数。使用的方法是先说明函数模板,然后实例化成相应的模板函数进行调用执行。1.函数模板函数模板的一般说明形式如下:template<模板参数表><返回值类型><函数名>(形参表){//函数定义体}<模板参数表>尖括号中不能为空,参数可以有多个,用逗号分开。模板类型参数由关键字class或typename后加一个标识符构成,两个关键字的意义相同,它们表示后面的参数名代表一个基本数据类型或用户定义的类型。
如果类型形参多于一个,则每个类型形参都要使用class或typename。如:template<classT>,则“T”可以在程序运行时被任何C++语言支持的数据类型所取代。如有两个以上的模板参数时,使用逗号分隔,如:“template<classT1,classT2>”。【例2.13】编写一个对具有n个元素的数组a[]求最小值的程序,将求最小值的函数设计成函数模板。#include<iostream.h>template<classT>Tmin(Ta[],intn)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 怀化学院《应用商务英语》2023-2024学年第二学期期末试卷
- 郑州财税金融职业学院《经贸英语阅读》2023-2024学年第二学期期末试卷
- 湖南水利水电职业技术学院《画法几何及工程制图》2023-2024学年第二学期期末试卷
- 山东信息职业技术学院《综合商务英语(3)》2023-2024学年第二学期期末试卷
- 吉首大学《针灸推拿技术》2023-2024学年第二学期期末试卷
- 湖北中医药高等专科学校《急诊医学Ⅰ》2023-2024学年第二学期期末试卷
- 房地产代理交易合同
- 水泥运输合同书
- 单位临时工雇佣劳务合同
- 寒暑假工劳务合同
- 欧洲法国意大利签证行程单
- C语言程序设计第5章--循环结构程序设计
- 人教版八年级上册:《芦花荡》课文原文
- 超星尔雅学习通《婚恋职场人格(武汉理工大学)》章节测试附答案
- ISO9001质量管理体系培训(共60页).ppt
- 商业票据与核算
- (完整版)PHQ-9抑郁症筛查量表
- 山中问答教学设计
- 基于高中思想政治学科核心素养的教学研究与实践PPT课件
- 矿山及其他工程破损山体植被恢复技术(DOC25页)
- 铝合金门窗、百叶施工组织设计
评论
0/150
提交评论