C++语言基础51065课件_第1页
C++语言基础51065课件_第2页
C++语言基础51065课件_第3页
C++语言基础51065课件_第4页
C++语言基础51065课件_第5页
已阅读5页,还剩68页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

SE422312面向对象技术与工具1精品课件C++语言基础C++语言基础2精品课件C++语言概貌数据类型函数指针数组o

第一个C++程序3精品课件#include

<iostream>//包含ANSIC++库文件

using

namespace

std;//使用预定义的名字空间stdvoid

main(

void

){cout<<“Hello,

world!”<<endl; //输出字符串}程序的第一行是#include<iostream>。#include是一条编译预处理指令,它的作用是在源文件中插入iostream文件所包含的所有源代码。

iostream文件是标准C++的一个库文件。C语言的头文件都有后缀.h,C++语言可以直接使用这些带.h后缀的头文件。4精品课件o为避免命名的冲突,ISO/ANSI

C++标准将每一个C语言的头文件对应地改造为一个库文件(文件名仅仅是将原文件的.h去掉),并将该文件中定义的标识符定义在标准的名字std中。o

包含头文件iostream的目的是为了使用标准输出流cout和endl

。通过using

namespace

std语句来引入名为std的名字空间。5精品课件解决问题的方案有两个:使用名字限定符std::cout

<<

“Hello,

world!”

<<

std::endl;使用using指令using

namespace

std;一旦引入某个名字空间,就不需要在属于这个名字空间的标识符前加上名字空间限定了。o

每个C++程序都必须并且只能有一个main函数。这是C++从C那里承袭来的。main函数与其它的用户自定义函数一样,可以带有参数(由命令行参数给出),并且也可以有返回值。例如:6精品课件int

main(int

argc,

char

*argv[

])o

C++的输入和输出可以:7精品课件使用C的外部库函数(如printf、scanf等,它们包含在头文件stdio.h或cstdio中);C++还提供了自己的输入输出方式;通过使用运算符“>>”和“<<”实现,需要包含库文件

iostream。输入和输出输入格式为:cin>>变量名;“>>”在C语言中是右移运算符,在C++语言中,如果第一个操作数为cin,它就是输入运算符。输出格式为:变量cout<<表达式常量(各种类型常量均可)“<<”在C语言中是左移运算符,在C++语言中,如果第一个操作数为cout,它就是输出运算符。输入和输出运算符可以连用。8精品课件o

为程序加入适当的注释是非常有价值的,因为这些注释可以为我们阅读程序提供帮助。9精品课件C++具有C的多行风格注解。使用“/*”开始,直到

“*/”结束,可以注解多行,但不允许嵌套。C++也提供一种新的表示注解的方法,

Comment_to_end_of_line的结构,使用“//”开始,直到行尾结束。oC++的内建(Built-in)类型10精品课件1.整型C++整数类型包括字符型char、短整型short、整型int和长整型long。下面的这些数的类型都属于整数类型:-128,-30,0,64,65535,680712可以用到的整数类型有8种:char,

short,

int,

long,

unsigned

char,

unsignedshort,

unsigned

int,

unsigned

long其中,unsigned

int可以简写为unsigned。2.字符型字符型char是一种特别的整数类型。字符型数据在内存中是以ASCII码的形式存储的。由于字符的存储值ASCII码是个整数,因此在某些情况下我们会把字符数据当作整型数据来参与运算。C++的转意字符序列。比如,’\n’并不代表字符

’n’,而是表示新行(newline)。这里符号\(反斜杆)叫做转意字符,意思是跟在它后面的

字符不再是原来的含义,而是有其它的含义。如果当要用到\符号本精身品课件,需要把它写成’\\’。113.布尔型布尔型bool是一种特殊的内建整数类型,因为它采用与整数相同的存储方式。不过,布尔类型的表达范围非常有限,只能取

false和true两个值。这是两个C++的关键字,而且是两个字符常量标识符,并不是字符串。应该注意的是,虽然这里把bool类型归为整数类型,但这并不等于我们可以把它当作整数使用。bool类型主要用来精表品课件达一种逻辑真或假的状12态,它的含义和用途与整数是完全不同的。o

浮点类型浮点数指的是带有小数部分的数,用来表示数学意义上的实数。实数的表示是:整数部分.小数部分其中小数部分看起来也是个整数。除了小数点,整数部分和小数部分可以缺省,但不能两者

都缺。下面是一些浮点数的例子:3.14159,-123.45,0.957,6.,.2C++的浮点类型有三种:float、double、longdouble。13精品课件o标识符14精品课件为了使C++程序更加易读易写,我们会用一些

有意义的名字来标识程序元素,比如数据、函数

等等。那些用来标识程序元素的名字就是标识符。使用自定义标识符也是所有高级语言的特征。标识符是由字母A-Z,a-z和数字0-9混合而成的,另外可以加入下划线‘_’。不过,所有的标识符必须以字母或者是下划线‘_’开头。o

标识符命名一个标识符的时候,遵循一些常用的约定:15精品课件取一个有意义的名字。如果名字由多个单词组成,那么每个单词的第一个字母用大写。(C++是大小写敏感的语言)使用匈牙利记号。匈牙利记号是一种前缀,是在标识符的前面加上一个小写字母以示其数据类型。o

变量声明charboolintdoublecData;bFlag;iPage,

nCount;fDelta;3.变量和命名常量

变量声明一旦声明了一个变量,这个变量在运行时就会在内存中占据一定大小的空间。例如声明变量iPage在内存中的映像如下图所示:iPage0x0013FF78……内存单元的32位地址内存单元的符号名内存单元的大小在32位机上是4字节16精品课件163.变量和命名常量17精品课件17常量(NamedConstant)和const关键字常量一些常量(字面常量)和所属类型的例子:10(int)077L(long)0xABCDu(unsigned

int)9.78f(float)7905.30(double)‘A’(char)3.变量和命名常量18精品课件18命名常量使用字面常量省掉了占用内存单元的开销,但也有一些缺点:在多处使用了相同的字面常量,而后来又要对这个常量进行修改时就会显得非常麻烦;字面常量没有明确的类型信息,它们的类型采用编译器的约定。为了解决上述的问题,可以使用C风格的没有参数的宏定义:#define

PI

3.14PI并不是真正的符号常量。仅是一个字符串,没有类型,不占用存储空间,不能取它的地址。3.变量和命名常量19精品课件192.

命名常量C++提供灵活的命名常量方式来描述常数:

const

float

PI=3.14;PI成为一个真正的符号常量,有类型,需要占用存储空间(存放在常量数据区)。PI的值不能被修改。数据类型汇总C++的数据类型地址类型简单类型结构类型整数类型布尔型bool字符型[unsigned]char短整型[unsigned]short整型[unsigned]int长整型[unsigned]long浮点类型单精度浮点型双精度浮点型floatdouble长双精度浮点型longdouble枚举类型enum指针类型pointer引用类型reference数组

array结构

struct联合

union类

class20精品课件204

用户自定义类型-枚举21精品课件21用宏来定义一系列表示状态的常量有明显的缺陷,就是没有类型信息。C++提供了一种更好的解决方案,就是使用枚举类型:enum

TrafficLight

{

RED,

GREEN,

AMBER};标识符RED、GREEN、AMBER被称为枚举常量,它们不是字符串,也不是整型常量。另外,枚举常量是有序的。4

用户自定义类型-数组22一维数组一维数组的定义如下:TYPE

array[整型常量];二维数组在处理像矩阵这样的二维阵列(这正是array这个词汇的原意)时,使用二维数组const

int

ROW

=

3;const

int

COL

=

5;int

arr[ROW][COL];一维字符数组一维字符数组往往被用来表示字符串。不过,数组最后一个有效字符的后面必须是个结束标记。这样的字符串被称为ASCIZ字符串。char

szName[]精品=课件{‘K’,‘e’,‘n’,‘\0’};224

用户自定义类型-结构和联合231.结构struct数组是相同类型数据的集合。当要把不同类型的数据集合在一起时,会用到结构struct。结构的例子struct

Employee

{intcharcharshortint//工号//姓名//性别//出生年份//工作部门号};23nID;szName[30];cGender;nDOB;nDeptID;精品课件4

用户自定义类型-结构和联合24精品课件242.联合union联合的定义类似于结构的定义;联合和结构的不同之处在于,联合变量的每个成员都共享同样的内存单元。一个联合变量的大小实际上是它占据内存最多的那个成员的大小。4

用户自定义类型-指针25精品课件25

指针是另外一个变量的地址,通过这个地址可以间接地访问到那个变量。int

nUnit;int

*

pi

=

&nUnit;符号*表明了变量pi是一个指针变量;运算符&的功能是取变量nUnit的地址。这样,pi单元的内容就是

nUnit单元的地址。4

用户自定义类型-指针由于指针是地址,因此所有指针单元的大小都是一样的。但是,这并不意味的两个指针变量可以互相赋值,因为指针是有类型之分的。指针类型可以看作有两部分组成:①首先它是个指针(值为地址);②其次,指针变量指向了一个特定类型的变量。float

*

pf;26精品课件4

用户自定义类型-指针指针和常量修饰符constconst也可以与指针一起使用,它们的组合情况复杂一些,可归结为三种:指向常量的指针常指针指向常量的常指针。2727精品课件4

用户自定义类型-指针28指向常量的指针const

TYPE

*

pc;pc指向的单元不能改变,但pc可以改变常指针TYPE

*

const

cp=…;cp不能改变,但它指向的单元可以改变指向常量的常指针const

TYPE

*

const

cpc=…;cpc指向的单元不能改变,cpc不可以改变精品课件5

用户自定义类型-引用引用就是给一个变量取一个别名。也就是说,引用与它所引用的变量实际上是同一个单元(共享存储单元)。引用主要有以下三个用途:(1)独立引用;例如:int

i;int

&

j

=

i;(2)作为参数传递;(3)作为返回类型。后2者有意义。2929精品课件引用作为函数参数30精品课件C语言采用传值(call byvalue)方式进行参数传递。当一个函数需要修改对应的实参的值时,参数应明确声明为指针类型。void

fun(int

num){

num=100;}void

main(

)

{int

annum=10;fun(annum);cout<<annum;}输出10实参与形参的传递方式为:int

num=annum引用作为函数参数31精品课件void

fun(int&num){num=100;}void

main(

)

{int

annum=10;fun(annum);cout<<annum;}输出100实参与形参的传递方式为:int

&num=annumvoid

fun(int

*

p){*p=100;}void

main(

)

{int

annum=10;fun(&annum);cout<<annum;}输出100实参与形参的传递方式为:int

*p=&annum引用作为函数参数32精品课件C++有两种参数传递的方式:传值方式(变量或指针做参数)传地址方式(引用做参数)C++采用传值方式进行参数传递时,当一个函数需要修改用作参数的变量值时,参数应明确声明为指针类型。若函数的一个参数是引用,那么,它与对应的实参共享实参的单元,或称该形参就是实参。实参将地址传给形参,作为形参的地址。这样,函数中对形参的任何访问和修改实际上就是对实参的访问和修改。C++引用参数类似于Pascal中的VAR参数(变量参数)引用作函数的返回33精品课件函数返回引用,实际上返回的是一个存储单元(变量)因此,如果一个函数返回引用的话,则函数调用可以出现在赋值号的右边(作为表达式的一部分,因为变量的值可以被使用),也可以出现在赋值号的左边(因为变量的值也可以被修改)。函数返回引用,那么,return后面应该为引用。除了独立引用外,还可以是:数组元素static变量指针所指向的变量,即*p结构的分量联合的分量int

&

get_var(int

*

pint){

return

*pint;}void main(){intanint=10;

intother_int;other_int=get_var(&anint)*12;get_var(&anint)=200;}34精品课件注意:35精品课件某些C++的版本不允许直接返回一个变量,int

&

get

reference(int

x){

return

x;

} //错误但是,另一些C++版本(如VC++)则允许。4

用户自定义类型-typedef36精品课件36用typedef定义类型的别名对于一些复杂的类型,在它们的定义中有较多的限定符或修饰符,可以用C++的typedef语句为那些类型提供一个简单的别名。例如:typedef

int

INT;typedef

double

(*DBLARRPTR)[10];//定义一个指针类型,该类型的指针指向一个长度为10的double型数组5

C++运算符37精品课件37

1

常用运算符算数运算符:

+

-

*

/

%

++

--关系运算符:

>

>=

==

<

<=!=(not_eq)逻辑运算符:

!

&&

||

not

and

or位运算符:

~

&

|

^移位运算符:

<<

>>赋值运算符:

=

+=

-=

*=

/=

%=<<=

>>=

|=

&=

^=条件运算符:

?:常用运算符38精品课件38求字节运算符:指针运算符:sizeof*

&成员选择运算符:

->

.*

->*[

](

)::,下标运算符:

函数运算符:

域选择运算符:逗号运算符:

其它运算符5

C++运算符-内存管理39精品课件39动态存储分配和释放存储空间的功能,C语言是利用malloc和free函数完成的。void

*

malloc(size_t

size);

void free(void

*p);C++提供了新的运算符new和delete来完成动态存储分配和释放存储空间的工作:new的参数是待分配单元的数目,它自动计算要分配类型的大小,而不给出要分配的存储区的大小(字节数);new自动返回正确的指针类型,不必对返回指针进行类型转换;可以用new将分配的存储空间进行初始化;new40精品课件运算符new用于内存分配的使用形式为type

*

p;p=new

type;其中,type是一个数据类型名;p是指向该数据类型的指针;new从堆的一块空闲内存区中分配一块内存,其大小就是type类型的数据长度,该内存地址被存于指针p中。如果分配失败,new返回一个空指针。type可以是任何类型,包括函数指针,但不允许函数类型。当type为数组类型时,new返回的指针指向数组的第一个元素,当用new创建多维数组时,必须提供所有维的大小。注意:使用new申请的存储空间是没有名字的,只能通过指针间接访问它们delete41精品课件运算符delete释放new分配的存储空间,将其交还给堆。它的使用形式一般为delete

p;其中,p必须是一个指针,保存着new分配的内存的首地址。动态分配管理的方法要求delete的操作数必须是一个new返回的指针,对不是由new得到的任何其他地址类型,使用delete将导致严重错误。这种错误是运行时的错误,很难调试,因此使用delete时请务必注意。回收new分配的数组空间,使用delete进行delete

[]

p;表明一个由

p

指向的数组空间被回收了。new和delete典型用法42精品课件1

动态分配和释放单个数据的存储区语法为:type

*

p;p=new

type;…//通过*p方式访问new申请的空间。delete

p;int

main(

)

{int

*

p;p=new

int;if

(!p)

{cout<<“allocation

failure\n”;return1;}*p=20;…delete

p;

return

0;}43精品课件2

用new运算符初始化单个数据的存储区语法为:type

*

p;p=new

type(…);…delete

p;44精品课件动态分配数组的存储空间45精品课件(1)一维数组语法为:type

*

p;p=new

type[s];… //通过p[i]的方式访问数组元素。delete

[]

p;(2)n维数组46精品课件语法为:type

(* p)[常量1][常量2]…[常量n-1];p=new type[s][常量1][常量2]…[常量n-1];…//通过p[i1][i2]…[in]的方式访问数组元素。delete

[]

p;s指定数组中的第一维元素个数,可以是常量或表达式。不能省略

。C++运算符-类型转换运算符47隐式转换隐式转换发生在下述的情况下:混合运算:级别低的类型向级别高的类型转换。将表达式的值赋给变量:表达式的值向变量类型的值转换。实参向函数形参传值:实参的值向形参的值进行转换。函数返回值:返回的值向函数返回类型的值进行转换。显式类型转换显式类型转换有几种风格:C风格:C++风格:47(TYPE)表达式

(TYPE)(表达式)TYPE精品(课表件达式)C++运算符-类型转换运算符48精品课件48显式类型转换使用类型安全的显式类型转换运算符float

fnum

=

5.8;const

int

icnum

=

10;int

inum

=static_cast<int>(fnum);int

inum2

=

const_cast<int>(icnum);6.表达式49精品课件49C++的表达式是一种能计算出一个值的语法分量,它的形式化定义如下:表达式

:=变量名

|

常量名

|

字面常量表达式

:=(表达式

)表达式

:=表达式运算符表达式6.表达式-简单语句和复合语句50精品课件50在任何合法的C++表达式后面加上一个分号“;”就能使其构成一条合法的C++语句。甚至一个单独的分号也能成为语句,这叫空语句。任何C++声明都是语句。多条语句可以复合在一起完成一定的功能。这些语句构成了复合语句。复合语句必须放在一对花括号{}之间。7.C++语句51精品课件51流程控制语句if-else语句

if(bool表达式)语句1[else语句2](ex2-11.cpp)7.C++语句-流程控制语句52精品课件52switch-case语句switch(整型表达式){case常量表达式1:语句1;break;case常量表达式2:语句2;break;…default:语句n;}(ex2-12.cpp)7.C++语句-流程控制语句53精品课件53循环语句while(bool表达式)语句do{语句}while

(bool表达式);for(表达式1;表达式2;表达式3)语句7.C++语句-流程控制语句54精品课件541.

break和continue语句在循环控制语句当中,如果我们根据某个条件需要提前结束整个循环,我们可以利用break语句。不过,break语句只能终止包含它的那层循环

语句。如果这层循环包含在另一个外层循环之内,那么break就鞭长莫及了。忽略此后的包含在循环体中的语句而直接进入下一次的循环可以使用continue语句。7.C++语句-流程控制语句1.

goto语句很多的专家都认为应该取消goto语句,不过C++还是保留了它。现在goto语句的最大作用就是从嵌套很深的循环中直接跳出来。在其它的场合尽量少使用goto语句。其实goto语句也可以构成循环,不过在高级语言程序中我们都不这么做,除非有特别的理由。return语句return语句会引起函数立刻返回(结束),main函数也不例外。return语句的格式为:return

[表达式];精品课件

55557.C++语句-流程控制语句56精品课件561.

try-catch语句try-catch语句用于保护容易发生错误的语句块,并且能在错误发生时捕获错误,然后对错误进行处理。它的语法如下:Try{语句*;}[catch(类型1[变量名1]){语句;}catch(类型2[变量名2]){语句;}…catch(类型n[变量名3]){语句;}]8.函数函数原型声明和定义函数原型是一个很重要的概念,函数原型担负着三个特殊的任务:①

确定函数返回值的类型,使编译程序能产生函数返回数据类型的正确代码。②

确定了函数使用的参数的类型、个数和顺序。③

函数名代表该函数的函数体以及函数完成的功能。函数原型一般的语法形式为返回类型函数名(参数列表)57精品课件578.函数58精品课件58函数的参数C++采用“传值”或“传地址”的方式来使实际参数和形式参数相结合。传值调用(Call

by

value)2.实参和形参是两个不同的单元,在结合时,实参的值将会被拷贝到形参中。2、传地址引用做参数。形参是实参的别名。也就是说,形参就是实参本身。这样一来,对形参的改变也就直接改变了实参。8.函数-参数59精品课件59用const修饰参数使用指针和引用参数,实参存在被更改的潜在“危险”。为了避免这种危险,可以给形参加上const约束,这是形参/实参成为只读参数,从而避免了被更改的问题。缺省参数缺省参数是另一种形式的重载(函数调用的重载)void fun(int

num

=

0) {

}其中:num称为缺省参数,0称为缺省值。可以用两种方式调用函数fun:fun(10); //

传递显式的值,则num的初始值为10fun(); //

无对应的实参,则num的初始值为08.函数-返回值}60精品课件60函数是一个完成一定功能的程序块,在很多时候需要将计算的结果传递给调用该函数的程序块。传递结果的方式之一就是让函数返回一个值。实际上是将返回的值放到一个结果寄存器或临时单元中。1.函数返回值函数返回的值类型,int

strlen(const

char

*str){char

*p

=

str;While

(*p)p++;return

p

str;8.函数-返回值612.函数返回指针函数返回指针,实际上也是返回一个值,不过这个值是某个单元的地址。char

*

strcat(const

char

*str1,

const

char

*str2){char

*

str=new

char[

strlen(str1)+strlen(str2)+1];char

*

p

=

str;while

(*p++

=

*str1++);p--;while

(*p++

=

*str2++);return

str;}精品课件8.函数62精品课件62

函数的返回值3.函数返回引用函数返回引用,实际上返回的是一个存储单元(即变量)。8.函数-内联函数63精品课件63许多C程序员使用带有参数的宏调用来完成简单函数的调用,但宏很受限,每个变元仅能被引用一次,有时会产生不可期望的副作用。例如:#define

abs(v)

((v)

<

0

?

-(v):

(v))当调用为abs(++a)时,将不能正确工作!因为在程序中每次遇到宏替换名时,就用所定义的字符串去替换它,那么替换的结果将是((++a)

<

0

?

-(++a)

:(++a))得到的是a+2的绝对值,这产生不期望的结果。8.函数-内联函数64精品课件64宏替换的好处是没有系统的调用开销。函数正相反。为结合两者的优点,C++语言允许定义内联函

数。在函数原型前冠以“inline”表示一个内联函数。例如:inline

void

function(int

a,

intb);编译时,在调用function的地方用函数体替换,能够加快代码执行,减少调用开销。8.函数-递归65精品课件65函数递归调用是一个函数直接或者间接调用

自己。递归是非常有用的一种调用方式,因为它可以减少代码量。不过,递归代码一般不容易理解,并且执行时对资源(主要的栈资源)消耗较大。8.函数-重载66精品课件66由于所有C++函数都有函数原型,因此C++容易表达重载(overload)一个函数名的概念。亦即它能区分多个函数,即使它们具有相同的名字但有不同的参数。C++允许进行函数重载:多个函数具有相同的函数名,但有不同的参数表和各自的函数体。只要编译能区分参数表(参数个数和类型),就可以重载一个函数名。8.函数-重载67精品课件67double

abs(double

num){return

((num

<

0

)

?

温馨提示

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

评论

0/150

提交评论