C++程序设计及互动多媒体开发 课件 第2章 C++新增语言_第1页
C++程序设计及互动多媒体开发 课件 第2章 C++新增语言_第2页
C++程序设计及互动多媒体开发 课件 第2章 C++新增语言_第3页
C++程序设计及互动多媒体开发 课件 第2章 C++新增语言_第4页
C++程序设计及互动多媒体开发 课件 第2章 C++新增语言_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++程序设计第2章C++新增语言第1节C++输入输出第2节循环语句新特性第3节动态内存分配第4节函数新特性第5节异常第1节C++输入输出命名空间cout语句cin语句使用VisualStudio2022创建一个HelloWorldC++程序

#include<iostream>intmain(){

std::cout<<"HelloWorld!\n";}对比VC6.0创建的HelloWorldC语言代码:#include"stdafx.h"intmain(intargc,char*argv[]){printf("HelloWorld!\n");return0;}发现有所不同1.1cout输出语句用于在计算机屏幕上显示信息用“流”(stream)的方式实现<<:输出流符号需包含头文件stream。即#include<iostream>属于C++98标准//以后不标注默认为属于C++98。语法:

cout<<表达式1<<表达式2<<……<<表达式n;e.g.inta=3;boolb=true;charc='m';chard[6]="China";cout<<a;cout<<b<<''<<c<<endl;//endl表示换行

cout<<d<<"isabigcountry."<<endl;cout控制符需包含头文件#include

<iomanip>e.g.doublepi=3.1415926535,e=2.71828183;//固定输出两位小数cout<<setiosflags(ios::fixed)<<setprecision(2)<<pi<<“”<<e<<endl;控制符描述dec置基数为10,后由十进制输出(系统默认形式)hex置基数为16,后由十六进制输出oct置基数为8,后由八进制输出setfill(c)设填充字符为csetprecision(n)设置实数的精度为n位setw(n)设域宽为n个字符setiosflags(ios::fixed)固定的浮点显示setiosflags(ios::scientific)指数表示setiosflags(ios::left)左对齐setiosflags(ios::right)右对齐setiosflags(ios::skipws)忽略前导空白setiosflags(ios::uppercase)16进制数大写输出setiosflags(ios::lowercase)16进制数小写输出1.2命名空间(namespace)在C++中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称互相冲突性的可能性越大。另外使用多个厂商的类库时,也可能导致名称冲突。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入关键字namespace(命名空间/名字空间/名称空间),可以更好地控制标识符的作用域。例:创建一个命名空间:namespaceA{intx=20;}namespaceB{intx=30;}voidfunction(){cout<<"A::x:"<<A::x<<endl;cout<<"B::x:"<<B::x<<endl;}using声明语法://释放整个命名空间到当前作用域

usingnamespace命名空间名称;//释放某个变量到当前作用域

using命名空间名称::变量名或函数名;e.g.usingnamespacestd;或usingstd::cout;使用命名空间,改写HelloWorld#include<iostream>usingnamespacestd;intmain(){cout<<"HelloWorld!\n";}1.3cin输入语句从键盘获取数据,对指定的变量进行赋值用“流”(stream)的方式实现>>:输入流符号需包含头文件stream。即#include<iostream>语法:

cin>>表达式1>>表达式2>>……>>表达式n;e.g.inta;cin>>a;floatf;chars[20];cin>>f>>s;cout、cin举例例2-3改写例1-6,用cin、cout对结构体的数据进行输入输出#include"iostream.h"//usingnamespacestd;//VC6.0不需此句structstudent//结构体的定义{charname[30];charnum[10];charsex;intage;floatMathScore;floatEnglishScore;floatPoliticsScore;};floatAverage(structstudentstu){ return(stu.MathScore+stu.EnglishScore+stu.PoliticsScore)/3;}voidmain(){studentstu1,stu2;//结构体变量定义

cout<<"请输入第一位学生的姓名、学号、性别、年龄、以及数学、英语、政治三科成绩:"<<endl;

cin>>>>stu1.num>>stu1.sex>>stu1.age>>stu1.MathScore>>stu1.EnglishScore>>stu1.PoliticsScore;

cout<<"请输入第二位学生的姓名、学号、性别、年龄、以及数学、英语、政治三科成绩:"<<endl;

cin>>>>stu2.num>>stu2.sex>>stu2.age>>stu2.MathScore>>stu2.EnglishScore>>stu2.PoliticsScore;

cout<<<<"的平均分是"<<Average(stu1)<<endl;cout<<<<"的平均分是"<<Average(stu2)<<endl;}第2节循环语句新特性auto关键字(C++11)范围for语句(C++11)2.1auto关键字属于C++11标准早在C++98标准中就存在了auto关键字,那时的auto用于声明变量为自动变量,自动变量意为拥有自动的生命期,这是多余的,因为就算不使用auto声明,变量依旧拥有自动的生命期:inta=5;//拥有自动生命期autointb=10;//拥有自动生命期staticintc=15;//延长了生命期C++98中的auto多余且极少使用,C++11已经删除了这一用法,取而代之的是全新的auto:变量的自动类型推断。C++11中,auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型。e.g.inta=5;autob=a;//自动类型推断,b为int类型

cout<<typeid(b).name()<<endl;//typeid运算符可以输出变量的类型autoc=3.1416;//自动类型推断,c为float类型

autod='A';//自动类型推断,d为char类型

cout<<"c的类型为"<<typeid(c).name()<<endl;cout<<"d的类型为"<<typeid(d).name()<<endl;auto一般在循环语句中用得较多,可以使循环语句更加简洁易懂

e.g.for(autoi=1;i<10;i++){……}对比以下两种写法:

(1)std::vector<std::string>vs;//vector和iterator是后面章节会学到的类型。向量和迭代器for(std::vector<std::string>::iteratori=vs.begin();i!=vs.end();i++){//...}

(2)std::vector<std::string>vs;for(autoi=vs.begin();i!=vs.end();i++){//..}2.2范围for语句C++11标准一种更简单的for语句,用于遍历一个序列。语法:

for(类型变量:数组){//对变量(即数组中每个元素)进行处理}e.g.intf[]{1,1,2,3,5,8,13,21,34,55,89,144};//fabonaci数列前十二项

for(autox:f)//对数组f中的每个元素,依次进行处理{cout<<x<<endl;}例2-4改写例1-1,使用范围for语句实现九九乘法表#include<iostream>usingnamespacestd;intmain(){intnums[]={1,2,3,4,5,6,7,8,9};cout<<"输出表:"<<endl;

for(autoi:nums){for(autoj:nums){cout<<j<<'*'<<i<<'='<<i*j<<'\t';if(j>=i)break;}cout<<endl;}return0;}第3节动态内存分配关于动态内存分配new运算符delete运算符3.1关于动态内存分配为什么需要动态内存分配?程序中大部分的内存需求都是在程序执行之前通过定义所需的变量来确定的。但是可能存在程序的内存需求只能在运行时确定的情况。例如,当需要的内存取决于用户输入。C语言动态内存分配语句回顾malloc函数:动态分配指定字节的内存

定义:void*malloc(unsignedintnum_bytes);e.g.int*p;p=(int*)malloc(sizeof(int));//动态申请能储存一个整数的内存。*p代表该无名字整数char*q;//声明一个字符指针,准备动态申请一个用户指定长度的字符数组(字符串)intsize;scanf(“%d”,&size);//用户对size赋值,用户指定数组长度q=(char*)malloc(size*sizeof(char));//动态申请长度为size的字符数组动态分配的内存需要在程序结束之前全部释放,否则会造成内存泄露。free函数:释放之前动态分配的内存

定义:voidfree(void*FirstByte)e.g.char*Ptr=NULL;Ptr=(char*)malloc(100*sizeof(char));......

free(Ptr);Ptr=NULL;3.2new与delete运算符C++提供了new与delete运算符,进行动态内存分配语法:①变量申请:类型*pointer=new类型;//...

deletepointer;②数组申请:类型*pointer=newType[N];//N为数组元素个数//...

delete[]pointer;例2-5C++动态分配内存演示例子#include<iostream>usingnamespacestd;intmain(){int*p=newint;//动态申请一个整型变量*p=5;*p=*p+10;cout<<"p="<<p<<endl;cout<<"*p="<<*p<<endl;

deletep;//释放变量内存

p=newint[10];//动态申请一个10个元素的整型数组

for(inti=0;i<10;i++){p[i]=i+1;cout<<"p["<<i<<"]="<<p[i]<<endl;}

delete[]p;//释放数组内存

return0;}第4节函数新特性内联函数后置返回类型(C++11)引用参数函数重载4.1inline内联函数内联函数是C++中的一种特殊函数,它可以像普通函数一样被调用,但是在调用时并不通过函数调用的机制而是通过将函数体直接插入调用处来实现的,这样可以大大减少由函数调用带来的开销,从而提高程序的运行效率。一般来说inline用于定义某些短小并将被频繁调用的函数。只需在函数定义前加inline关键字就可以把函数定义为内联函数。编译器在编译阶段对内联函数进行处理。只是对编译器的建议,具体有没有真正内联,要看编译器。优缺点:

优点:利用得好,程序会提高性能,

缺点:利用得不好,会造成代码臃肿。语法:

inline

返回值类型函数名(函数参数){//此处定义函数体}e.g.

inlinedoubleVolume(doubler,doubleh)//函数定义{ doubleSd/*底面积*/,V/*体积*/; Sd=PI*pow(r,2); V=Sd*h; returnV;}4.2函数后置返回类型C++11标准语法:

一个普通前置返回类型的函数

返回类型函数名(参数列表)

可改写成:

auto

函数名(参数列表)->返回类型e.g.voidfunc(inta,intb);

可改写成:

autofunc(inta,intb)->void;4.3引用参数引用:是某一个变量或对象的别名。对引用的操作与对其所绑定的变量或对象的操作完全等价语法:类型&引用名=目标变量名;e.g.doublea=10.3;double&b=a;b=b+10;cout<<“a=“<<a<<“,b=“<<b<<endl;传值参数传址参数例2-6阅读程序,判断每个swap函数是否能实现变量数值的对换。#include<iostream.h>voidswap1(inta,intb);voidswap2(int*pa,int*pb);//voidswap3(int&a,int&b)intmain(){intx=3,y=5;cout<<"Beforeswap:x="<<x<<",y="<<y<<endl;C语言的两种函数参数swap1(x,y);//swap2(&x,&y);//swap3(x,y);cout<<"Afterswap:x="<<x<<",y="<<y<<endl;return0;}voidswap1(inta,intb)//传值参数{intt;t=a;a=b;b=t;}voidswap2(int*pa,int*pb)//传址参数{intt;t=*pa;*pa=*pb;*pb=t;}C++新增:引用参数引用参数voidswap3(int&a,int&b){intt;t=a;a=b;b=t;}综合例子例2-7改写例1-5求圆柱表面积和体积的例子,要求改为:

(1)函数Volume改为内联函数和后置返回类型;

(2)函数Area()除了返回表面积外,还要返回底面积和侧面积。//因为后置返回类型为C++11新特性,因此用VS2022创建工程#include"math.h"#include<iostream>usingnamespacestd;constdoublePI=3.1215926535;doubleArea(doubler,doubleh,double&Sd/*底面积*/,double&Sc/*侧面积*/);//函数声明autoVolume(doubler,doubleh)->double;//函数声明intmain()//主函数{ doubleradius,height,areaSurface,areaBottom,areaSide; cout<<"请输入圆柱半径:"; cin>>radius; cout<<"请输入圆柱高度:"; cin>>height; areaSurface=Area(radius,height,areaBottom,areaSide); cout<<"圆柱表面积="<<areaSurface<<endl; cout<<"圆柱底面积="<<areaBottom<<endl; cout<<"圆柱侧面积="<<areaSide<<endl; cout<<"圆柱体积="<<Volume(radius,height)<<endl; return0;}doubleArea(doubler,doubleh,double&Sd/*底面积*/,double&Sc/*侧面积*/)//函数定义{ doubleS/*表面积*/; Sd=PI*pow(r,2); Sc=2*PI*r*h; S=Sc+2*Sd; returnS;}inlineautoVolume(doubler,doubleh)->double

//函数定义{ doubleSd/*底面积*/,V/*体积*/; Sd=PI*pow(r,2); V=Sd*h; returnV;}4.4函数重载我们在平时写代码中会用到几个函数但是他们的实现功能相同,但是有些细节却不同。例如求绝对值,在C语言中有以下函数:

intabs(intx)//求整数的绝对值longlabs(long)//求长整数的绝对值doublefabs(doublex)//求double小数的绝对值floatfabsf(floatx);//求float小数的绝对值doublecabs(structcomplexz)//计算复数的绝对值

用户(应用程序员)需把每个函数名都记住,显然很麻烦。用户能不能只需记一个函数,就能使用所有功能呢?于是C++提出了用一个函数名定义多个函数,这就是函数重载(Overload)C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。例2-8编写程序,使用函数重载的方法,用一个函数名实现前述C语言的各个求绝对值函数。#include"math.h"intMyAbs(intx)//整数版本{returnx>0?x:-x;}__int64MyAbs(__int64x)//长整数版本{if(x>=0)returnx;elsereturn-x;}doubleMyAbs(doublex)//双精度小数版本{returnsqrt(x*x);}floatMyAbs(floatx)//单精度小数版本{return(float)sqrt(x*x);}doubleMyAbs(_complexc)//复数版本{returnsqrt(c.x*c.x+c.y*c.y);}intmain(){printf("|-5|=%d\n",MyAbs(-5));printf("|-50000000000|=%I64d\n",MyAbs(-50000000000));printf("|-8.0000000009|=%.10f\n",MyAbs(-8.0000000009));printf("|-8.9|=%f\n",MyAbs(-8.9));_complexa;a.x=10;a.y=10;printf("|(10,10)|=%f\n",MyAbs(a));return0;}构成重载的条件:参数列表不同分析以下两种情况,是否构成函数的重载。第一种情况:(1)voidoutput();

(2)intoutput();第二种情况:(1)voidoutput(inta,intb=5);

(2)voidoutput(inta);思考:尝试修改例2-4,函数swap1、swap2、swap3是否可以修改为同名重载函数?第5节异常异常处理C++标准异常5.1C++异常处理异常是程序在执行期间产生的问题。C++异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。异常提供了一种转移程序控制权的方式。C++异常处理涉及到三个关键字:try、catch、throw·throw:当问题出现时,程序会抛出一个异常。·catch:在想要处理问题的地方,通过异常处理程序捕获异常。·try:

try块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个catch块。语法:try{//保护代码。正常情况下程序会执行完这里的代码。//但遇到异常(出错)情况时抛出异常}catch(ExceptionNamee1){//catch块。如果上面抛出的异常是e1类型,执行该段。}catch(ExceptionNamee2){//catch块。如果上面抛出的异常是e2类型,执行该段。}……catch(ExceptionNameeN){//catch块。如果上面抛出的异常是eN类型,执行该段。}catch(…)//catch块。(…)表示如果异常不是以上列出的所有类型,执行该段。}//注:以上每个catch段皆为可选例2-9一个捕捉除数为0的异常的程序#include<iostream>usingnamespacestd;doubledivision(doublea,doubleb){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论