面向对象程序设计-2_第1页
面向对象程序设计-2_第2页
面向对象程序设计-2_第3页
面向对象程序设计-2_第4页
面向对象程序设计-2_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计(C++)第2讲

C++简单程序设计龚勋【xgong@】1一、C++的发展历史

C++是在C语言的基础上为支持面向对象的程序设计而研制的一个通用目的程序设计语言,它是在1980年由AT&T贝尔实验室的BjarneStroustrup博士创建的。最初的C++被称为“带类的C”,1983年正式取名为C++。C++语言的标准化工作从1989年开始,于1994年制定了ANSIC++标准草案,以后又经过了不断完善至今。2.1C++概述2二、C++语言的特点

C++是一个更好的C,它保持了C的简洁、高效和接近汇编语言等特点,对C的类型系统进行了改革和扩充,比C更安全,C++的编译系统能检查出更多的类型错误。

C++完全兼容C,因此不是一个纯的OOP语言,它既支持面向过程的程序设计方式,又支持OOP方式。三、C++源程序默认的文件扩展名为CPP。若使用C作为源程序扩展名,C++编译器将只按C语言规范进行编译,即扩展名为C的源程序无法使用C++扩展的新特性。2.1C++概述(续1完)3除了传统的stdio.h头文件中的输入/输出函数外,可用OOP方式的输入/输出流对象进行输入/输出。输入/输出流对象头文件为iostream.h。2.2C++方式的输入与输出4一、用cout进行输出语法格式:cout{<<表达式}*其中,{…}*表示{}中内容可以重复1~若干次

<<称为插入运算符例:cout<<“Hello!\n”;

//输出Hello!并换行

floata=3.45F;intb=5;charc=‘A’;cout<<“a=“<<a<<“,”<<“b=“<<b<<“,”<<“c=”<<c;

输出结果是:a=3.45,b=5,c=A在iostream.h中定义了控制符endl,实现回车换行操作,

cout<<endl;等效于cout<<“\n”;2.2C++方式的输入与输出(续1)5补充:iostream与iostream.h区别C++的标准类库被修订了两次,有两个标准C92和C99,这两个库现在都在并行使用:用.h包含的是c92不带.h的是c99的头文件对于普通用户来说这两者没有什么区别,区别是在内部函数的具体实现上。旧的C++头文件是官方明确反对使用。6例:for(i=1;i<=3;i++)cout<<“count=“<<i<<endl;程序的输出为:count=1count=2count=3输出列宽控制:setw(整型表达式)头文件iomanip.h将setw(n)插入到cout流,可以指定其后输出的数据项的列数,若数据项长度小于列宽,数据左边补足空格,否则按实际位数输出。例:cout<<“a=“<<setw(10)<<15;输出结果为:a=15;2.2C++方式的输入与输出(续2)7二、用cin进行输入语法格式:cin{>>变量名}*其中,>>称为提取运算符例:floata;intb;cin>>a>>b;例:打印如左图形到屏幕上,打印行数n由键盘输入。*************************#include"iostream.h"#include"iomanip.h"voidmain(){inti,j,n;cout<<"Inputn=";cin>>n;for(i=1;i<=n;i++){cout<<setw(n-i+1);for(j=1;j<=2*i-1;j++)cout<<"*";cout<<endl;}}2.2C++方式的输入与输出(续3)8注意:输入的过程中,应注意输入的值与变量之间的对应关系,包括数字部分和非数字部分、整数部分和小数部分等,不同数值之间也需要用空格分隔。对于输出流cout,虽然从表面上看其输出顺序是从左到右,但处理顺序则是从右到左的。例:输出流cout处理顺序和输出顺序charf(){cout<<"A";return'B';}charg(){cout<<"C";return'D';}voidmain(){cout<<"E"<<f()<<g();}2.2C++方式的输入与输出(续4完)最后结果为CAEBD9一、const型常量syntax:const数据类型名常量名=常量表达式;例:constdoublepi=3.1415926;constintn=10;floata[n];程序中不允许修改常量pi的值,因此,可视pi为符号常量。二、局部变量的定义可以与语句混合,且初始化可以用含有变量和函数调用的表达式例:voidmain(){intn;cin>>n;ints=0;

for(inti=1;i<=n;i++)s+=i;

cout<<“s=“<<s<<endl;intk=-s;cout<<k<<endl;}//局部变量的作用域从定义位置起至本模块结束2.3C++扩展C的一些新特性10三、行注释以//开头至本行尾,都是程序注释。如:voidmain()//Thisismainprogram.四、强制类型转换

syntax1:(类型名)表达式syntax2:类型名(表达式)例:写一个表达式,求一个实型变量x的小数部分

x-int(x)//int(…)是截尾取整2.3C++扩展C的一些新特性(续1)11五、取全局对象运算符syntax:

::对象名

//功能:访问全局对象例:floata=13.5F;voidmain(){inta=5;cout<<a<<endl;cout<<::a<<endl;}

上面的程序使用::a,使得在主函数中可以访问全局变量a,该程序的输出是:513.5注意:不能用::运算符访问函数中的局部变量。2.3C++扩展C的一些新特性(续2)12六、内存动态分配与撤销运算符new与delete1.new运算符按照指定要求,分配内存,返回内存块的首地址,分配失败,返回NULL指针。syntax1:

new类型名;//单变量指针syntax2:new类型名(初值)//单变量指针syntax3:new类型名{[元素个数]}*

//数组指针例:int*p=newint;//分配4字节,以存放一个整数

int*q=newint(100);//对象*p的初值为100char*s=newchar[10];//建立10元字符数组

float(*pt)[4]=newfloat[5][4];//建立5行4列二维实型数组2.3C++扩展C的一些新特性(续3)132.delete运算符syntax1:delete地址表达式;//撤销单变量空间syntax2:delete[]地址表达式;//撤销数组空间例3-2编程输入整数n,然后输入n个英文单词,并按字典顺序输出这n个单词。#include"iostream.h"#include"string.h"voidmain(){chars[81];intn;cout<<"Inputnumbersofwords:";cin>>n;char**w=newchar*[n];2.3C++扩展C的一些新特性(续4)14cout<<"Input"<<n<<"words:"<<endl;for(inti=0;i<n;i++){cin>>s;w[i]=newchar[strlen(s)+1];strcpy(w[i],s);}for(i=0;i<n-1;i++)for(intj=0;j<n-1-i;j++)if(strcmp(w[j],w[j+1])>0) {char*p=w[j];w[j]=w[j+1];w[j+1]=p;}for(i=0;i<n;i++){cout<<w[i]<<"";delete[]w[i];}cout<<endl;delete[]w;}2.3C++扩展C的一些新特性(续5)15七、变量的引用类型1.引用的概念“引用”(reference)是C++的一种新的变量类型,是对C的一个重要扩充。它的作用是为一个变量起一个别名。假如有一个变量a,想给它起一个别名b,可以这样写:inta;int&b=a;注意:经过上述定义后,变量b并没有开辟新的存贮空间,它和变量a都是同一个变量,有共同的存贮空间。2.引用类型作函数的形参例:实现两个实型变量交换值的函数。2.3C++扩展C的一些新特性(续6)16voidmain(){doublex=1.5,y=80.33;swap(x,y);printf("x=%.2f,y=%.2f\n",x,y);}voidswap(doublex,doubley){doublet=x;x=y;y=t;}为什么不能实现主调程序两个变量换值?1.5main-80.33xy1.5swap-80.33xy1.5-80.33函数调用swap(x,

y);2.3C++扩展C的一些新特性(续7)17voidmain(){doublea=-1.25,b=0.34;swap(a,b);cout<<a<<""<<b<<endl;}#include"iostream.h"voidswap(double&x,double&y){doublet=x;x=y;y=t;}引用类型形参,可以实现主调程序两个变量换值1.5main-80.33abxy函数调用swap(x,

y);引用类型形参的特点是不进行值传递,形参变量名只是实参变量名的代名字,在子函数中,形参变量发生改变,事实上是主调程序中对应的实参变量发生了改变。2.3C++扩展C的一些新特性(续8)18voidmain(){doublea=-1.25,b=0.34;swap(&a,&b);cout<<a<<""<<b<<endl;}指针形参,可以实现主调程序两个变量换值#include"iostream.h"voidswap(double*p,double*q){doublet=*p;*p=*q;*q=t;}1.5main-80.33ab&xswap&ypqx的地址y的地址函数调用swap(&a,&b);paqb2.3C++扩展C的一些新特性(续9)19例

字符串逆序存贮。#include"iostream.h"#include"string.h"voidswap(char&a,char&b){chart=a;a=b;b=t;}voidreverse(char*s){char*p=s,*q=s+strlen(s)-1;while(p<q)swap(*p++,*q--);}voidmain(){chars[80];cout<<"Inputastring:";cin>>s;reverse(s);cout<<"Reversedstringis:"<<s;}2.3C++扩展C的一些新特性(续10)20问题与思考:在上例中,swap(a,b);可以写成swap(-1.25,0.34);吗?注意:引用只能针对单变量,不能针对数组进行。2.3C++扩展C的一些新特性(续11)21不可以。22八、变量初始化的两种形式syntax1:

数据类型名变量名=表达式;syntax2:

数据类型名变量名(表达式);例:inta=5;doublex=1.25;C++中,还可写为inta(5);doublex(1.25);2.3C++扩展C的一些新特性(续12完)C++继承了C语言的全部语法,包括函数定义和使用方法。在面向过程的结构化程序设计中,函数是模块划分的基本单位,是对处理问题过程的一种抽象。在面向对象的程序设计中,函数同样重要,它是面向对象程序设计中对功能的抽象。要求掌握:第三章函数

函数定义与使用

几种特殊函数

函数的重载233.1函数的定义和使用一、函数的定义

函数的定义格式

类型修饰符函数名(形式参数表){

函数体}

243.1函数的定义和使用(续1)

声明与定义区别:声明是向编译器介绍名字——标识符。它告诉编译器“这个函数或这个变量在某处可找到,它的模样像什么”。定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中靠开辟空间来保存变量的数据。对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。25二、函数的调用函数调用格式及调用方式函数声明:调用函数之前先要在主调函数中声明函原型。在主调函数中,或所有函数之前,按如下形式声明:类型说明符被调函数名(含类型说明的形参表)函数调用:声明了函数原型之后,就可以按下面的形式来调用子函数。函数调用的一般格式:函数名(实参列表)3.1函数的定义和使用(续2完)263.2内联函数1、内联函数定义在一般函数定义前面加上保留关键字inline,该函数即被说明为内联函数。例如:inlineintadd2(intn){returnn+2;}

对于内联函数,C++有可能直接用函数体代码来替代对函数的调用,这一过程称为函数体的内联展开。27不能有循环、switch等例:#include<iostream.h>inlinefloatmax(floata,floatb)//内联函数,计算最大值{…}voidmain(){floatscore[2];//存放2个学生的分数floatmax_score;max_score=max(score[0],score[1]);

//调用内联函数求最大值,在编译时就已经被替换为了max的函数体,而不是本语句cout<<“maxscore=”<<max_score<<endl;}3.2内联函数(续1完)28讨论:inline应该放在哪里//a.hinlinevoidfoo(void);//a.cinlinevoidfoo(void){}//b.c#include"a.h"voidbar(void){foo();}这种用法inline是不起任何作用的只有这样://a.hinlinevoidfoo(void){}//b.c#include"a.h"voidbar(void){foo();}这样才能真正的内联;内联是在编译期间处理的293.3带默认形参值的函数

函数在定义时可以预先定义出默认的形参值。调用时如果给出实参,则用实参初始化形参;如果没有给出实参,则采用预先定义的默认形参值。

例:intarea(intl=5,intw=5){returnl*w;}voidmain(){area();//采用默认值5和5进行计算,返回结果25;area(10,2);//实参10和2传递给形参,返回结果20;area(2);//将值2传递给形参l,w采用默认值5,返回值10;}30注意:

形参默认值应在函数原型中给出(而不是在函数体中给出)默认形参值必须按照从右向左顺序定义。调用时,实参按从左向右顺序初始化形参。(即如果有三个形参,实参为一个时,则会初始化第一个形参,而另外两个要采用默认值…)。所以,在有默认值的形参右边,不能出现无默认值的形参。3.3带默认形参值的函数(续1)313.3带默认形参值的函数(续2完)例:判断以下用法是否正确?

intarea(intl,intw=4);

intarea(intl=3,intw);

intarea(intl=3,intw,inth=9);!错误,这样如果调用时为area(10),则10会赋值给l,而w得不到初始值,编译错误(mis

温馨提示

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

评论

0/150

提交评论