![第二讲 C++程序设计基础简化_第1页](http://file4.renrendoc.com/view/3c6652dac3df3bbaef0d6601488d236a/3c6652dac3df3bbaef0d6601488d236a1.gif)
![第二讲 C++程序设计基础简化_第2页](http://file4.renrendoc.com/view/3c6652dac3df3bbaef0d6601488d236a/3c6652dac3df3bbaef0d6601488d236a2.gif)
![第二讲 C++程序设计基础简化_第3页](http://file4.renrendoc.com/view/3c6652dac3df3bbaef0d6601488d236a/3c6652dac3df3bbaef0d6601488d236a3.gif)
![第二讲 C++程序设计基础简化_第4页](http://file4.renrendoc.com/view/3c6652dac3df3bbaef0d6601488d236a/3c6652dac3df3bbaef0d6601488d236a4.gif)
![第二讲 C++程序设计基础简化_第5页](http://file4.renrendoc.com/view/3c6652dac3df3bbaef0d6601488d236a/3c6652dac3df3bbaef0d6601488d236a5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二讲C++程序设计基础主要内容C++语言基本输入输出函数及新增特性new、delete操作符引用作用域、可见性、生命期C++标准输入输出流
在C++中用istream类和ostream类的派生类iostream控制输入输出,并提供了输入和输出操作符,cin:它是istream类的对象,用来处理标准输入,即键盘输入。cout:它是ostream类的对象,用来处理标准输出,即屏幕输出。使用时务必包含#include<iostream.h>。<<称为插入操作符,其作用是向cout流中插入字符。>>称为提取操作符,其作用是从cin流中提取字符。无格式输出cout无格式输入cincout<<变量1<<变量2…<<变量n;cin>>数据1>>数据2…>>数据n;cout<<变量1<<变量2<<变量n;cin>>变量1>>变量2>>变量n;函数调用机制c++的函数调用过程,需要调用初始化和善后处理的环节。函数调用的整个过程就是栈空间操作的过程。函数调用时,C++首先:1.建立被调函数的栈空间2.保护调用函数的运行状态和返回地址3.传递参数4.将控制转交被调函数函数的返回机制函数的调用机制当函数调用结束时,如果存在返回值,系统会自动创建一个和返回值类型相同的临时变量,将返回的局部变量的值赋给这个临时变量,然后恢复调用函数的运行状态,释放栈空间,释放局部变量,使其属于调用函数栈空间的一部分,再根据返回地址,回到主调函数,在主调函数中使用临时变量的值,当函数调用语句结束时,再释放临时变量的空间。内联函数内联扩展(inlineexpansion)简称为内联(inline),内联函数也称为内嵌函数。当在一个函数的定义或声明前加上关键字inline则就把该函数定义为内联函数,它主要是解决程序的运行效率。计算机在执行一般函数的调用时,无论该函数多么简单或复杂,都要经过参数传递、执行函数体和返回等操作,这些操作都需要一定的时间开销。若把一个函数定义为内联函数后,在程序编译阶段,编译器就会把每次调用该函数的地方都直接替换为该函数体中的代码,由此省去函数的调用及相应的保存现场、参数传递和返回操作,从而加快整个程序的执行速度。
内联函数可以在一开始仅定义或声明一次,但必须在函数被调用之前定义或声明。否则,编译器不认为那是内联函数,仍然如同对普通函数那样处理该函数的调用过程。内联函数的函数体有一些限制:内联函数中不能含有任何循环以及switch和goto语句;内联函数中不能说明数组;递归函数(自己调用自己的函数)不能定义为内联函数。通常只适合1~5行的小函数。函数重载C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。例:形参类型不同intadd(intx,inty);floatadd(floatx,floaty);形参个数不同intadd(intx,inty);intadd(intx,inty,intz);不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:intadd(intx,inty);intadd(inta,intb);编译器不以形参名来区分intadd(intx,inty);voidadd(intx,inty);编译器不以返回值来区分intadd(intx,inty){returnx+y;}floatadd(floatx,floaty){returnx-y;}重载函数的形参必须不同:个数不同或类型不同。编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。函数参数的默认值函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。intadd(intx=5,inty=6){returnx+y;}voidmain(void){add(10,20);//10+20add(10);//10+6add();//5+6}默认形参值必须从右向左顺序声明,并且在默认形参值的右面不能有非默认形参值的参数。因为调用时实参取代形参是从左向右的顺序。例:int
add(int
x,inty=5,intz=6);//正确int
add(intx=1,inty=5,intz);//错误int
add(intx=1,inty,intz=6);//错误new和delete运算符
new和delete操作符是c++语言的一部分,使用时无须包含头文件,从堆中分配和释放内存块。语法:
newT(初始值
)//T是类型
创建一个T类型对象,若成功,返回值为对象首地址,否则NULL。
newT[E]//E是算术表达式
创建一个T类型对象数组,成功时返回值为数组首地址,否则NULL,不允许有初始值,且类的构造函数参数为空或都有缺省值。
delete指针变量删除一个指针变量所指的对象
delete[]指针变量删除一个指针变量所指的对象数组char*pstr=newchar[10];delete[]pstr;pi=newint[10][10];float*p=newfloat;const指针指向常量的指针constinta=78;constintb=28;intc=18;constint*pi=&a;*pi=58;//errorpi=&b;*pi=68;//errorpi=&c;*pi=88;//errorc=98;指针常量char*constpc=“asdf”;pc=“dfgh”;//error*pc=‘b’;*(pc+1)=‘c’;*pc++=‘y’;//errorconstintb=28;int*constpc=&b;//errorconstintci=7;intai;constint*constcpc=&ci;constint*constcpi=&ai;cpi=&ai;//error*cpi=39;//errorai=39指向常量的指针常量*pi是常量,但pi可以改变*cpc和cpc都是常量pc是常量,但*pc可以改变引用的概念引用的概念
引用是个别名,当建立引用时,程序用另一个变量或对象(目标)的名字初始化它。建立引用后,引用作为目标的别名而使用,对引用的改动实际就是对目标的改动。引用的声明
为建立引用,先写上目标的类型,后跟引用运算符“&”,然后是引用的名字。引用能使用任何合法变量名。
intsomeInt;int&rInt=someInt;
引用不是值,不占存储空间,声明引用时,目标的存储状态不会改变。引用只有声明,没有定义。且在声明时必须初始化,否则产生编译错误。引用的操作如果程序寻找引用的地址,它返回目标的地址引用一旦初始化,就维系在一定的目标上,再也不分开,任何对该引用的赋值,都是对引用所维系的目标赋值,而不是将引用维系到另一个目标上。引用与指针的差别指针是变量,可以把它再赋值成其他的地址。建立引用时必须进行初始化并且决不会再指向其他不同的变量。什么能被引用若一个变量声明为T&,即引用时,它必须用T类型的变量或对象,或能够转换成T类型的对象进行初始化若引用类型T的初始化不是一个左值,那么将建立一个T类型的目标并用初值初始化,那个目标的地址变成引用的值例:double&rr=1;doubletemp;temp=double(1);double&rr=temp;int*a;int*&p=a;intb=8;p=&b;0110:F14E0110:F890ap80110:F14Eb由于指针也是变量,所以可以有指针变量的引用。不允许进行引用对void进行引用是不允许的。void&a=3;void只是在语法上相当于一个类型,本质上不是类型。不能建立引用的数组。inta[10];int&ra[10]=a;引用本身不是一种数据类型,故没有引用的引用,也没有引用的指针。例:inta;int&ra=a;int&*p=&ra;
引用不能用类型来初始化:int&ra=int;
因为引用是变量或对象的引用,而不是类型的引用。有空指针,无空引用。int&ri=NULL;用引用传递函数参数传递引用给函数与传递指针的效果一样,传递的是原来的变量或对象,而不是在函数作用域内建立的变量或对象的副本。引用具有指针的威力,但是调用引用传递的函数时,可读性却比指针传递好。引用具有传值方式函数调用语法的简单性与可读性,但是威力却比传值方式强。引用存在的问题引用可以表达清晰并让程序员负责了解如何传递参数,但是在有些情况下它们能够隐藏错误。
inta=10;intb=20;swap(a,b);引用隐藏了函数所使用的参数传递的类型,无法从所看到的函数调用判断其是值传递还是引用传递。例:
voidfn(ints){//…}voidfn(int&t){//…}voidmain(){inta=5;fn(a);}用引用返回值函数只能返回一个值,若程序需要从函数返回多个值,引用和指针都可以用来实现这一过程。函数返回值时,要生成一个值的副本。而用引用返回值时,不生成值的副本。#include<iostream.h>floattemp;floatfn1(floatr){temp=r*r*3.14;returntemp;}float&fn2(floatr){temp=r*r*3.14;returntemp;}voidmain(){floata=fn1(5.0);
float&b=fn1(5.0);
floatc=fn2(5.0);
float&d=fn2(5.0);cout<<a<<endl;cout<<b<<endl;cout<<c<<endl;cout<<d<<endl;}如果返回不在作用域范围内的变量或对象的引用,这与返回一个局部作用域指针的性质一样严重。函数调用作为左值返回一个引用使得一个函数调用表达式成为左值表达式。只要避免将局部栈中变量的地址返回,就能使函数调用表达式作为左值来使用。传递指针和引用的目的是效率,当一个数据类型很大时,因为传值要复制副本,故不可取,但传递指针和引用存在传值所没有的危险。保护实参不被修改的办法是传递const指针和引用。C++不区分变量的const引用和const变量的引用。程序决不能给引用本身重新赋值,使它指向另一个变量,因此引用总是const的。若对引用应用关键词const,其作用是使目标成为const变量。即没有:constdoubleconst&a=1;只有:constdouble&a=1;外部存储类型一个程序在很小的规模下,可以用一个源文件来完整表达。具有应用价值的程序由多个源文件组成,根据C++程序的定义,其中只有一个源文件具有主函数main(),而其他的文件不能含有主函数。所有函数声明一般都放在源文件的开始位置。构成一个程序的多个源文件之间,通过声明数据或函数为外部的(extern)来进行沟通。带extern的变量不在本文件中分配空间,而在程序的其它文件中分配空间(变量定义)。默认的函数声明或定义总是extern的。它告诉连接程序,在所有组成该程序的文件中搜索该函数。带extern的变量说明是变量声明,不是变量定义静态存储类型静态全局变量静态函数在全局变量前加一个static,使该变量只在这个源文件中可用,称之为全局静态变量(静态全局变量)。在一个源文件中,全局变量和静态全局变量没有区别。在多文件组成的程序里,全局静态变量使得该变量成为定义该变量的源文件所独享。使一个变量只在一个源文件中全局使用有时是必要的。第一,不必担心另外源文件使用它的名字,该名字在源文件中是唯一的。第二,源文件的全局变量不能被其他源文件使用,不能被其他源文件所修改,保证变量的值是可靠的。
函数的声明和定义默认情况下在整个程序中是extern(外部的),有时需要使某个函数只在一个源文件中有效,不能被其他源文件所用,在函数前面加上static。它允许其他源文件建立并使用同名的函数,而不相互冲突,在很大的编程项目中它是一个优势。在文件作用域下声明的inline函数默认为static存储类型。声明的const的常量默认为static存储类型。若加上extern,则为外部存储类型。作用域局部作用域函数作用域文件作用域函数原型作用域当标识符的声明出现在由一对花括号所括起来的一段程序(块)内时,该标识符的作用域从声明点开始,到块结束处为止,该作用域的范围具有局部性。标号是唯一具有函数作用域的标识符。goto语句使用标号标号声明使得该标识符在一个函数内的任何位置均可以被使用。
函数原型声明(不是函数定义)中所作的参数声明在该作用域中。这个作用域开始于函数原型声明的左括号,结束于函数原型声明的右括号。
文件作用域是在所有函数定义之外说明的,其作用域从说明点开始,一直延伸到源文件结束。静态全局变量和全局变量是文件作用域的,静态函数也是文件作用域的。所以文件作用域也称全局作用域。在头文件的文件作用域中所进行的声明,若该头文件被一个源文件嵌入,则声明的作用域也扩展到该源文件中,直到源文件结束。可见性可见性从另一角度表现标识符的有效性,标识符在某个位置可见,表示该标识符可以被引用。可见性与作用域是一致的。作用域指的是标识符有效的范围,而可见性是分析在某一位置标识符的有效性。可见性在分析两个同名标识符作用域嵌套的特殊情况时,非常有用。在内层作用域中,外层作用域中声明的同名标识符是不可见的,当在内层作用域中引用这个标识符时,表示的是对内层作用域中声明的标识符的引用。标识符的可见性范围不超过作用域,作用域则包含可见范围。若全局变量被隐藏,则可用符号::来引用该全局变量。{inti;charch;i=3;{doublei;i=3.0e3;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度终止劳动合同协议书:劳动合同终止与员工离职职业规划合同
- 新零售模式下的创意产业应用与发展研究
- 科技驱动下的工业互联网平台建设
- 科技驱动下的学校文化墙创新研究
- 科技赋能寿险产品创新的未来展望
- 电子产品的绿色设计与制造策略
- 2025年贵州健康职业学院高职单招语文2018-2024历年参考题库频考点含答案解析
- 2025年荆州职业技术学院高职单招职业适应性测试近5年常考版参考题库含答案解析
- 疫情防控背景下的家庭医生健康教育价值及实现途径分析
- 文字排版的美学原则与实践
- 教育环境分析报告
- 人力资源服务公司章程
- (正式版)CB∕T 4552-2024 船舶行业企业安全生产文件编制和管理规定
- 病案管理质量控制指标检查要点
- 2024年西藏中考物理模拟试题及参考答案
- 九型人格与领导力讲义
- 人教版五年级上册数学脱式计算练习200题及答案
- 卵巢黄体囊肿破裂教学查房
- 医院定岗定编
- 2023年大学物理化学实验报告化学电池温度系数的测定
- 脑出血的护理课件脑出血护理查房PPT
评论
0/150
提交评论