1C++程序设计主讲:信息科学与工程学院冯传胜Email:fcs@beelink.com办公室:信息楼4042•本书共十章,主要介绍C++中面向对象的部分。•本课程的前期课程为《C语言程序设计》或《C++语言中的过程性部分》。•如果有同学没有学过C语言,应在课外通过自学掌握C语言程序设计。•相应参考书目:–谭浩强:《C语言程序设计》–高能:《C++程序设计》3C语言中的部分内容的回顾•数据类型和运算符–基本数据类型•整型:如unsignedinta,b=10;longa=0L;•实型:如floata=1.0;doubleb=123.456;•字符型:如charc=‘a’,c2=‘\0’;–常用运算符•赋值运算符:a=1;b+=10;•算术运算符:+、-、*、/、%•关系运算符:>、<、=、=、==、!=•逻辑运算符:&&、||、!•其它(自增/减运算符、逗号运算符等)–数据定义集中定义,放在可执行语句之前–C++中数据定义位置随意,需要时定义4•结构化程序设计中的三种基本结构:–顺序结构:•四个函数:putchar(),getchar(),scanf(),printf()–选择结构:•if语句(单分支if语句,双分支if…else…语句)•switch语句(与break语名配合产生多分支结构)–循环结构:•while语句(当型循环)•do…while语句(直到型循环)•for语句•break语句和continue语句5•数组–是一种构造类型的数据。•如:•inta[5]=[1,2,3,4,5];•chara[10]=“abcdef”;–一维数组:•在内存顺序存放•排序算法–二维数组:•如inta[2][3]={{1,2,3},{4,5,6}};•在内存中按“行”存放。6•函数–函数是C语言源程序构成的基本单位。–main()函数–库函数和用户函数–函数的构成:•函数头•{函数体}•return语句–局部变量与全局变量–变量的存储类型•auto,register,static,externintadd(inta,intb){intz;z=a+b;return(z);}7•指针–C语言中的一种特殊数据类型,可以用于低级操作(对内存单元等直接访问)。–指针就是地址。–可以定义指针变量“指向”变量或数组等。–如,inta=10;int*pa=&a;*pa=15;–又如,inta[5]={1,2,3};int*pa=a;*(pa+1)=5;–与指针操作有关的两个运算符•&取地址运算符•*指针运算符(取内容)–数组元素的引用方式:(引用上面数组a的第四个元素)•下标法:如,a[3]=10;pa[3]=10;•指针法:如,*(a+3)=10;*(pa+3)=10;8•结构体–一种构造类型。–一个数组中所有元素的类型相同。而一个结构体中的各成员的类型可不同。如structstudent{longnum;charname[20];floatscore[3];floatsum;};voidmain(){Structstudenta={100001L,”Liping”,{85,76,99},0};a.sum=a.score[0]+a.score[1]+a.score[2];printf(“Name:%s\nSum:%10.1f\n”,a.name,a.sum)}引用成员运算符为“.”9–指向结构体变量的指针•如structstudent*pa=&a;•(*pa).num=10002L;//使用引用成员运算符•Pa->num=10002L;//使用指向成员运算符–结构体成员操作的两个运算符•结构体变量.成员名•结构体指针->成员名10第一章认识C++的对象主讲人:冯传胜Email:fcs@beelink.com11•1.1初识C++的函数和对象•1.2认识C++语言面向过程编程的特点–1.2.1使用函数重载–1.2.2新的基本数据类型及其注意事项–1.2.3动态分配内存–1.2.4引用–1.2.5对指针使用const限定符–1.2.6泛型算法应用于普通数组–1.2.7数据的简单输入输出格式•1.3程序的编辑、编译和运行的基本概念121.1初识C++的函数和对象•一切现实世界中客观存在的事物为对象。–如:一个点、一个图形、一个窗口等。–又如:•intx=10;•在C语言中表示定义整型变量x并赋初值为10。•在C++中应理解为声明了一个整型对象,其初值为10。为了与后面将要学的对象的构造函数对应起来,C++程序中常将上语句写为•intx(10);//x(10)为函数调用的形式。13一个例程序#includeiostreamusingnamespacestd;intresult(int,int);constintk=2;structPoint{intx,y;};intmain(){intz(0),b(50);Pointa;cout输入两个整数(以空格区分):;cina.xa.y;z=(a.x+a.y)*k;z=result(z,b);cout计算结果如下:endl;cout((a.x+a.y)*k)+b=zendl;return(0);}intresult(inta,intb){return(a+b);}#includestdio.h#definek2intresult(int,int);structPoint{intx;inty;};intmain(){intz=0,b=50;structPointa;printf(输入两个整数(以空格区分):);scanf(%d%d,&a.x,&a.y);z=(a.x+a.y)*k;z=result(z,b);printf(计算结果如下:\n);printf(((%d+%d)*%d)+%d=%d\n,a.x,a.y,k,b,z);return(0);}intresult(inta,intb){return(a+b);}14比较说明:–1、混合型语言•C++源程序文件的扩展名为“.cpp”。•有且只能有一个main函数。•真正的面向对象语言没有主函数。–2、灵活的注释方式•“//”(行注释)•“/*……*/”(段落注释)–3、使用输出和输入对象•从一个对象流向另一个对象抽象为“流”。•从流中获取数据的操作称为“提取操作”。•“”为提取操作符,如cina.x;•向流中添加数据的操作称为“插入操作”。•“”为插入操作符,如couta.x;•cin处理标准输入,cout处理标准输出。要使用这两个对象应用#include将其头文件“iostream”包含到源程序中。即•#includeiostream//不是语句,不能加“;”•“coutendl;”相当于“cout“\n”;”,功能为输出换行。15–4、使用命名空间•在C++中可以省略头文件的扩展名,如#includeiostream但同时应用语句usingnamespacestd;•命名空间是一种将程序库名称封装起来的方法,它提高了程序的性能和可靠性。•C++新标准类库的变量与函数都属于命名空间std;使用C++提供的头文件不用加扩展名。•使用一般头文件时应加上扩展名“.h”,如#includestdio.h•可用C++库中的头文件代替C库中的头文件,如,用#includecmath代替#includemath.h16–5、对象的定义及初始化•C++程序中常采用“构造函数语法”,如–intz(0);//等同于intz=0;–6、函数原型及其返回值•例中main函数的类型为int,所以在程序的后面有语句–return0;•如果函数不需要有返回值,则可声明为void型,这时函数体内不需要return语句(也可直接写为return;)•如果主调函数在被调函数的前面,应先声名后使用,如–intresult(int,int);–声明是为了告诉编译器函数的原型,所以没必要加参数的名字。17–7、const修饰符和预处理程序•符号常量–增强可读性–“一改全改”–标识符一般用大写字母•在C语言中用宏定义来定义“符号常量”,而在C++中常用const来定义“符号常量”,如–constintk=2;//也可写成constintk(2);–#definek2//宏定义•用const来定义可以表示出常量的类型。•定义符号常量的同时应赋初值,除非这个变量是用extern来修饰的外部变量。如–constinta;//错误–Externconstinta;//正确,是一个外部声明18•预处理是在编译以前进行处理,由预处理程序来实现。•三种预处理语句:–宏定义–文件包含–条件编译•所有预处理语句以“#”开头。如–#definePI3.14159–#include“filename”或#includefilename–<…>引用系统提供的文件;“…”引用自己定义的文件。•标准输入输出是定义在标准库iostream中,所以要用到以下两条语句#includeiostreamusingnamespacestd;19–8、程序的运行结果•输入两个整数(以空格区分):411414<CR>•计算结果如下:•((411+414)*2)+50=1700–9、程序的书写格式•书写格式自由:一行可以写多条语句,一条语句也可写在多行上。建议一行写一条语句。•注意缩进格式的应用。201.2认识C++语言面向过程编程的特点•C++兼容了C语言,且有一些新特点来设计面向过程的程序。•C++语言的标准模板库(StandardTemplateLibrary,STL)提供了与要操作的元素类型无关的算法,不仅使许多问题迎刃而解,而且也将许多面向对象的程序设计问题转化为基于对象的面向过程编程。21•1.2.1使用函数重载–C++允许同一个函数定义成几个版本,从而使一个函数名具有多种功能,这称为函数重载。例1.2:#includeiostreamusingnamespacestd;intmax(int,int);intmax(int,int,int);voidmain(){coutmax(35,25),“max(25,39,35)endl;}intmax(inta,intb){return(ab?a:b);}intmax(inta,intb,intc){intt;t=max(a,b);return(max(t,c));}结果:35,39max函数的重载,分别用于求两个整数和三个整数的最大值。22•1.2.2新的基本数据类型及其注意事项–void是无类型标识符,只能声明函数的返回值类型,不能用于声明变量。–C++新增了bool型。–C++标准只限定int和short至少16位,long至少32位,short不能长于int,int不能长于long。VisualC++6.0规定int使用4个字节。–运算符“&”用于取对象的地址。–C++中整数常量有4种类型:•十进制常量:-123,0,34567,+123•长整型常量:123L,-123L,0L•八进制常量:0123,0100,01234567•十六进制常量:0x10,0x1af–可用后缀表示浮点常量的类型:•F(或f)表示float型;•L(或l)表示longdouble型;–和C语言一样,可以使用转义序列。如‘\n’,‘\0’,‘\101’。23•1.2.3动态分配内存–在使用指针时,如果不用对象地址初始化指针,可以自己给它分配地址。地址申请方式如下:•new类型名[size]–含义为申请存储size个该类型对象的存储空间。–释放空间:•delete指针名.为结构分配(释放)内存:•Point*p;•p=newPoint;•deletep;例1.3:new和delete的使用。#includeiostreamusingnamespacestd;voidmain(){int*p;p=newint[10];for(inti=0;i10