章-C和VC++语言概述_第1页
章-C和VC++语言概述_第2页
章-C和VC++语言概述_第3页
章-C和VC++语言概述_第4页
章-C和VC++语言概述_第5页
已阅读5页,还剩274页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

VC++面向对象程序设计E-mail:heyue642695)学习目标与要求

开设本课程的目的是使学生掌握使用面向对象程序设计语言(VC++)进行应用程序设计的基本方法和技能,注重培养学生编程能力、分析问题和解决问题的能力。本课程的任务是使学生在复习C/C++语言基本内容的基础上,进一步掌握VC++面向对象程序设计的基本概念、原理和方法,特别是:类和对象、继承与派生、多态性与虚函数、运算符重载等内容必须完全掌握。同时,全面了解和掌握在可视化环境中VC++的编程方法和技巧。学习方法本课程的讲授是按章顺序进行,课前请做好预习,上课认真听讲,积极思考。仔细阅读教材中的大量例题,从而体会并最终掌握其中的编程方法和技巧。认真、独立、按时完成并提交作业。加强交流,多讨论,多阅读参考书、多请教,多提问,及时答疑解惑。重视上机实践,有效利用宝贵的上机时间。只有通过上机才能加深对概念的理解和认识,才能掌握编程方法和技巧。教材:《VC++面向对象程序设计教程与实验(第二版)》温秀梅等--清华大学出版社,2009.4参考教材:《面向对象程序设计教程》冷英男

李文超

--电子工业出版社,2007.6《C++面向对象程序设计教程》陈维兴

/

陈昕

/

林小茶

--清华大学出版社,2009.6

《面向对象程序设计教程(Java版)》C.ThomasWu--机械工业出版社,2007《VisualC#.NET面向对象程序设计教程》赵卫伟--机械工业出版社,2011.8教学环节:(总学时:60学时)课堂教学:30学时

上机实验:30学时,要求完成实验大纲中的7个实验自学:第九、十、十一、十二章作业:每章中间、结束后布置作业实验:每个实验后交实验报告(写在实验报告纸上)考核成绩:平时:10%,上机实验:20%,期末考:70%(注:期末考试采用闭卷形式)内容安排第1章

绪论

2学时第2章C++对C语言的扩充4+4学时第3章类和对象4+4学时第4章友元4+4学时第5章继承与派生6+6学时第6章多态性和虚函数4+6学时

第7章输入输出流库4+4学时

第8章异常处理2+2学时

第9章MFC编程基础

第10章对话框和控制

第11章菜单和文档/视图结构

第12章图形设备接口第一章C/VC++语言概述数理信息学院2009.8

面向对象技术概述程序书写规范

数据类型运算符和表达式

基本语句

函数

指针和引用

作用域和存储类型本章主要内容本章要点:掌握C++/VC++与C语言不同之处。掌握new、delete、引用、内联函数和函数重载的意义和作用。掌握C++/VC++程序的基本结构。面向对象方法的起源进入80年代,由于一系列高新技术的研究,使得软件设计人员的负担越来越重,软件的实现越来越庞大,传统的结构化程序设计思想已无法满足这一要求,为此,人们就开始寻求一种更能反映人类解决问题的自然方法,这就是“面向对象”技术。自80年代以来,出现了多种面向对象程序设计语言(简称为OOPL:ObjectOrientedProgrammingLanguage),如Ada,Smalltalk,C++和当前使用在Internet上的平台无关语言Java等。由于OOPL的对象、类具有高度的抽象性,所以它能很好地表达任何复杂的数据类型,也允许程序员灵活地定义自己所需要的数据类型。类本身具有很完整的封装性,可以使用它作为编程中的模块单元,满足模块独立自治的需求。再加上继承性和多态性,更有助于简化大型软件和大量重复定义的模块,增强了模块的可重用性,提高了软件的可靠性,缩短了软件的开发周期。天堂(主观世界)微风阳光海浪笑脸白云面向对象的认识观天堂(客观世界)改造世界将客观世界中的事务抽象为对象认识世界(抽象)面向对象方法的本质面向对象方法的本质,就是强调从客观世界中固有的事物出发来构造系统,用人类在现实生活中常用的思维方式来认识、理解和描述客观事物,突出最终建立的系统使之能够映射问题域。面向对象技术的基本概念

面向对象技术是一种以对象为基础,以事件或消息来驱动对象执行处理的程序设计技术。面向对象程序设计从所处理的数据入手,以数据为中心而不是以功能为中心来描述系统,因为数据相对于功能而言具有更强的稳定性。面向对象程序的主要结构特点

第一,程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规律;第二,程序中的一切操作都是通过向对象发送消息来实现的,对象接到消息后,启动有关函数完成相应的操作。面向对象的基本概念对象(object)

客观世界中的实体或者概念,可以将对象理解为事物。类(class)

具有相似特点的一组对象(群体)。对象由类统一描述。面向对象(object-oriented)

研究对象的属性和行为、对象间的关系以及对象间的活动。面向对象程序由类定义和对象的使用构成。 对象的概念(一)

面向对象技术认为客观世界是由各种各样的对象组成,每种对象都有各自的内部状态和运动规律,不同对象间的相互作用和联系就构成了各种不同的系统,构成了客观世界。对象是组成一个系统的基本逻辑单元,是一个有组织形式的含有信息的实体。对象既可以表示一个抽象的概念,也可以表示一个具体的模块,既可以表示软件,也可以表示硬件。对象的概念(二)对象(Object)由属性(Attribute)和行为(Action)两部分组成。属性是用来描述对象静态特征的一个数据项。行为是用来描述对象动态特征和行为的一个操作。对象是包含客观世界物体特征的抽象实体,是属性和行为的封装体。例:建立一个复数对象模型实部虚部加法减法乘法复数属性方法类的确定(一)

类(Class)是一个抽象的概念,用来描述具有相同属性和行为的一组对象的集合;类为属于它的全部对象提供了统一的抽象描述;类的内部包括属性和行为两个主要部分;类是对象集合的再抽象。划分原则:寻求一个大系统中事物的共性,将具有共性的系统成分确定为一个类。类的确定(二)确定某事物是一个类的步骤包括:

第一步,要判断该事物是否有一个以上的实例,如果有,则它是一个类;第二步,要判断类的实例中有没有绝对的不同点,如果没有,则它是一个类。因为类的每一个实例是相似的,具有相同属性和行为类别结构。不能把一组函数组合在一起构成类!

面向对象vs面向过程面向过程面向对象以功能为中心以数据为中心预定顺序事件驱动功能不稳定数据具有稳定性消息和事件事件(Event):用户或系统中发生的任何活动。消息(Message):是描述事件发生的信息。消息是对象之间发出的行为请求。多个消息构成一个事件。键盘消息事件消息队列提取消息处理信息应用程序其他消息鼠标消息多任务执行环境注:封装使对象成为一个相对独立的实体,其内部状态不因外界的干扰而改变,也不会涉及到其他对象;而消息机制为它们提供了一个相互间动态联系的途径,通过消息机制,把对象之间动态连接在一起,使它们的行为能互相配合,构成一个有机的运行系统。面向对象技术的基本特征

抽象性抽象就是忽略事物中与当前目标无关的非本质特征,更充分地注意与当前目标有关的本质特征。封装性封装就是把对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。继承性继承是一种联结类与类的层次模型。继承性是指特殊类的对象拥有其一般类的全部属性和行为的特性。多态性多态是指类中同一函数名对应多个具有相似功能的不同函数。多态性是指可以使用相同的调用方式来调用这些具有不同功能的同名函数的特性。结构化程序设计(面向过程的语言)设计思路:自顶向下、逐步求精程序结构:由模块形成的树形结构(强调的是功能抽象和模块化)基本组成结构:顺序、选择、循环程序=数据结构+算法+程序设计语言+语言环境程序设计方法的发展面向对象的方法设计思路:对客观事物的抽象程序特点:对类(对象的存在形式)进行结构化程序设计(强调的是功能抽象和数据抽象)类提供简单的对外接口C++:在C语言基础上扩充的,C语言的超集支持OOP的最主要代表语言程序=对象+对象+…+对象对象=算法+数据结构+程序设计语言+语言环境面向对象程序设计优于传统的结构化程序设计,其优越性表现在,它有希望解决软件工程的两个主要的问题——软件复杂性控制和软件生产率的提高,此外它还符合人类的思维习惯,能够自然地表现现实世界的实体和问题。20世纪60年代,Simula语言就具有了类和对象的概念。70年代初,美国XeroxPaloAlto研究中心推出了Smalltalk,它完整地体现并进一步丰富了面向对象的概念。混合型面向对象程序设计语言,如C++,这类语言一般是在传统的过程化语言中加入了各种面向对象的语言机制,它所强调的是运行效率。纯面向对象程序设计语言,如Java语言。面向对象程序设计语言Visualc++的发展1989年TurboCBorland1991年TurboC++1.01Borland1992年BorlandC/C++3.0Borland1995年VisualC++1.0Microsoft1998年VisualC++6.0Microsoft2001年VisualC#.netMicrosoft一个简单的C++程序//C++程序的基本结构#include<iostream.h>voidmain(){doubler,area;//声明变量cout<<“输入圆的半径:”;//显示提示信息cin>>r;//从键盘上输入变量r的值area=3.14159*r*r;//计算面积cout<<“圆的面积为:”<<area<<“\n”;/*输出面积*/}该程序经编译、连接、运行后,屏幕上显示:

输入圆的半径:10【Enter】

圆的面积为:314.159问题:输入圆的半径,求圆的周长和面积数据描述:

半径,周长,面积均用实型数表示数据处理: 输入半径r; 计算周长=2*π*r; 计算面积=pi*r2; 输出半径,周长,面积;一个简单的C++程序例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area; constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area;constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}数据描述半径:r、周长:girth、面积:area例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area;constdoublepi=3.1415;

cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}数据处理例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area;constdoublepi=3.1415;

cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}输入数据例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area;constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;

girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}计算周长和面积例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area;constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;

cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}输出计算结果例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area;constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}注释行例1-1方法一,用结构化方法编程,求圆的周长和面积

#include<iostream.h>voidmain(){doubler,girth,area;constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}//countthegirthandareaofcircle//thisisasimpleprogram注释:第一种形式:以”//”开始至行末例1-1方法一,用结构化方法编程,求圆的周长和面积

#include<iostream.h>voidmain(){doubler,girth,area;constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}/*thisisasimpleprogramcountthegirthandareaofcircle*/注释:第一种形式:以”//”开始至行末第二种形式:/*字符串*/例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area; constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}预编译指令声明该程序要使用的外部文件,iostream.h文件包含了输入cin和输出cout的定义。在程序编译之前把指定文件内容复制到此处例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area; constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}函数头例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area; constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}1.1概述函数返回值类型void

空类型例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area; constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}函数名main

主函数名,系统预定义例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area; constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}参数表没有参数不能省略圆括号例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area; constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}1.1概述函数体花括号相括的语句序列各语句以分号结束一行可以写多个语句一个语句可以分多行书写例1-1方法一,用结构化方法编程,求圆的周长和面积

//countthegirthandareaofcircle#include<iostream.h>voidmain(){doubler,girth,area; constdoublepi=3.1415;cout<<"Pleaseinputradius:\n";cin>>r;girth=2*pi*r;area=pi*r*r;cout<<"radius="<<r<<endl;cout<<"girth="<<girth<<endl;cout<<"area="<<area<<endl;}函数是程序基本运行单位,一般形式为:类型函数名(参数表){语句序列}说明:C++用标准输入输出的头文件iostream.h替代了C语言的stdio.h,用cin、cout和操作运算符>>、<<等实现并扩展了C语言的scanf和printf函数功能。cout表示标准输出流对象,用于屏幕输出,“<<”是插入符,它将后面的内容插入到cout中,即输出到屏幕上;cin表示标准输入流对象,用于键盘输入,“>>”是提取符,用来将用户键入的内容保存到后面的变量r中。“//”和“/*…*/”一样都是注释符,只是“//”仅作单行注释。分析“圆”是抽象的类类型建立具体的圆(对象)半径?圆的周长?面积?实例化例1-2用面向对象方法编程,求圆的周长和面积

例1-2用面向对象方法编程,求圆的周长和面积

分析圆类数据成员

半径成员函数

置半径值 求圆的半径

求周长

求面积实例化1.1概述例1-2用面向对象方法编程,求圆的周长和面积

#include<iostream.h>classCircle{doubleradius;public:voidSet_Radius(doubler){radius=r;}doubleGet_Radius(){returnradius;}doubleGet_Girth(){return2*3.14f*radius;}doubleGet_Area(){return3.14f*radius*radius;}};voidmain(){CircleA,B;A.Set_Radius(6.23);cout<<"A.Radius="<<A.Get_Radius()<<endl;cout<<"A.Girth="<<A.Get_Girth()<<endl;cout<<"A.Area="<<A.Get_Area()<<endl;B.Set_Radius(10.5);cout<<"B.radius="<<B.Get_Radius()<<endl;cout<<"B.Girth="<<B.Get_Girth()<<endl;cout<<"B.Area="<<B.Get_Area()<<endl;}例1-2用面向对象方法编程,求圆的周长和面积

#include<iostream.h>classCircle{doubleradius;public:voidSet_Radius(doubler){radius=r;}doubleGet_Radius(){returnradius;}doubleGet_Girth(){return2*3.14*radius;}doubleGet_Area(){return3.14*radius*radius;}};voidmain(){CircleA,B;A.Set_Radius(6.23);cout<<"A.Radius="<<A.Get_Radius()<<endl;cout<<"A.Girth="<<A.Get_Girth()<<endl;cout<<"A.Area="<<A.Get_Area()<<endl;B.Set_Radius(10.5);cout<<"B.radius="<<B.Get_Radius()<<endl;cout<<"B.Girth="<<B.Get_Girth()<<endl;cout<<"B.Area="<<B.Get_Area()<<endl;}Circle类定义例1-2用面向对象方法编程,求圆的周长和面积

#include<iostream.h>classCircle{doubleradius;public:voidSet_Radius(doubler){radius=r;}doubleGet_Radius(){returnradius;}doubleGet_Girth(){return2*3.14*radius;}doubleGet_Area(){return3.14*radius*radius;}};voidmain(){CircleA,B;A.Set_Radius(6.23);cout<<"A.Radius="<<A.Get_Radius()<<endl;cout<<"A.Girth="<<A.Get_Girth()<<endl;cout<<"A.Area="<<A.Get_Area()<<endl;B.Set_Radius(10.5);cout<<"B.radius="<<B.Get_Radius()<<endl;cout<<"B.Girth="<<B.Get_Girth()<<endl;cout<<"B.Area="<<B.Get_Area()<<endl;}数据成员例1-2用面向对象方法编程,求圆的周长和面积

#include<iostream.h>classCircle{doubleradius;public:

voidSet_Radius(doubler){radius=r;}doubleGet_Radius(){returnradius;}doubleGet_Girth(){return2*3.14*radius;}doubleGet_Area(){return3.14*radius*radius;}};voidmain(){CircleA,B;A.Set_Radius(6.23);cout<<"A.Radius="<<A.Get_Radius()<<endl;cout<<"A.Girth="<<A.Get_Girth()<<endl;cout<<"A.Area="<<A.Get_Area()<<endl;B.Set_Radius(10.5);cout<<"B.radius="<<B.Get_Radius()<<endl;cout<<"B.Girth="<<B.Get_Girth()<<endl;cout<<"B.Area="<<B.Get_Area()<<endl;}成员函数例1-2用面向对象方法编程,求圆的周长和面积

#include<iostream.h>classCircle{doubleradius;public:voidSet_Radius(doubler){radius=r;}doubleGet_Radius(){returnradius;}doubleGet_Girth(){return2*3.14*radius;}doubleGet_Area(){return3.14*radius*radius;}};voidmain(){CircleA,B;A.Set_Radius(6.23);cout<<"A.Radius="<<A.Get_Radius()<<endl;cout<<"A.Girth="<<A.Get_Girth()<<endl;cout<<"A.Area="<<A.Get_Area()<<endl;B.Set_Radius(10.5);cout<<"B.radius="<<B.Get_Radius()<<endl;cout<<"B.Girth="<<B.Get_Girth()<<endl;cout<<"B.Area="<<B.Get_Area()<<endl;}建立对象(类类型变量)例1-2用面向对象方法编程,求圆的周长和面积

#include<iostream.h>classCircle{doubleradius;public:voidSet_Radius(doubler){radius=r;}doubleGet_Radius(){returnradius;}doubleGet_Girth(){return2*3.14*radius;}doubleGet_Area(){return3.14*radius*radius;}};voidmain(){CircleA,B;

A.Set_Radius(6.23);cout<<"A.Radius="<<A.Get_Radius()<<endl;cout<<"A.Girth="<<A.Get_Girth()<<endl;cout<<"A.Area="<<A.Get_Area()<<endl;

B.Set_Radius(10.5);cout<<"B.radius="<<B.Get_Radius()<<endl;cout<<"B.Girth="<<B.Get_Girth()<<endl;cout<<"B.Area="<<B.Get_Area()<<endl;}通过对象调用类的成员函数面向对象程序设计举例分析:通过上述程序可以得知,在面向对象程序设计中,程序是由不同的对象构成的;类是一种用户自定义的数据类型,通过类定义的变量称为对象;类和对象构成面向对象程序设计的不同模块;通过不同的对象发送消息即可完成相应的操作。【例1-3】使用面向对象程序设计方法,编写一对堆栈进行处理的程序,包括压栈和弹栈操作。本章作业教材P15的1和4题。

C++的特点

C++语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了面向对象编程的支持,具有强大的编程功能,可方便地构造出模拟现实问题的实体和操作;编写出的程序具有结构清晰、易于扩充等优良特性,适合于各种应用软件、系统软件的程序设计。用C++编写的程序可读性好,生成的代码质量高,运行效率仅比汇编语言慢10%~20%。为了使编译器能够区别是C语言还是C++语言,C++语言体系规定用“.cpp”(意即CPlus-Plus)作为C++语言源文件的扩展名以区别于C语言用的“.C”文件扩展名。虽然仅差两个字母,但编译时的处理却相差甚远。与C++语言源文件相关的头文件扩展名一般仍用“.h”,但有些操作系统也有规定使用“.hpp”充当头文件扩展名的。

C++语言的文件扩展名

1.段注释:/*…*/2.单行注释:当只做单行注释时便可用“//”符号表示从此符号起至行尾均为行注释内容。3.程序编译时将忽略所有的注释内容。

C++注释符在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来。

名字空间(namespace)格式:

namespace名字空间域名称 {……

…}例如:

namespacens1{floata,b,c;fun1(){……}}声明块中可以包括:类、变量(带有初始化)、函数(带有定义)等。在域外使用域内的成员时,需加上名字空间名作为前缀,后面加上域操作符“::”。这种添加了名字空间名称的成员名被称为限定修饰名。如:ns1::a,ns1::fun1()等等。声明块最外层的名字空间域称为全局名字空间域(globalnamespacescope),即文件域。名字空间域可分层嵌套,同样有分层屏蔽作用。例如:

namespacen1{namespacen2{ //名字空间嵌套classmatrix{……} //名字空间类成员matrix}}访问matrix,可写:n1::n2::matrix。使用using声明可只写一次限定修饰名。using声明以关键字using开头,后面是被限定修饰的(qualified)名字空间成员名,例如:usingn1::n2::matrix;//名字空间类成员matrix的using声明。以后在程序中使用matrix时,就可以直接使用成员名,而不必使用限定修饰名。 使用using指示符可以一次性地使名字空间中所有成员都可以直接被使用,比using声明方便。using指示符以关键字using开头,后面是关键字namespace,然后是名字空间名。例如:usingnamespacen1;标准C++库中的所有组件都是在一个被称为std的名字空间中声明和定义的。在采用标准C++的平台上使用标准C++库中的组件,只要写一个using指示符:usingnamespacestd;就可以直接使用标准C++库中的所有成员。注意:如果使用了名空间std,则在使用#include编译预处理命令包含头文件时,必须去掉头文件的扩展名.h,否则会出错。C++语言另外定义了一套保留字与运算符来替代C语言中对标准输入、输出函数的引用。C++语言的保留字为:cout<<“输出内容”<<…;

//cout为标准输出流对象(默认输出到显示器)cin>>“输入内容”>>…;

//cin为标准输入流对象(默认从键盘输入)对应的头文件为:#include<iostream.h>

C++语言的输入输出【例2.1】C++的输入输出举例。#include<iostream>//使用名空间std,则必须去掉.h扩展名usingnamespacestd;voidmain(){charname[10];intage;cout<<"pleaseinputyourname:";cin>>name;cout<<"Howoldareyou:";cin>>age;cout<<"nameis"<<name<<endl;cout<<"ageis"<<age<<endl;}数据类型C++具有独特的基本数据类型:布尔型(bool),其值为true或false。由于在计算机内,编译系统将true表示成整数1,false表示成整数0,因此也可把布尔型看成是整型。例:boolflag;常量在C++中,除了用C语言的#define定义符号常量外,还常常用const来定义符号常量。格式为:

const<数据类型><常量>=<表达式>;例:constintPRICE=30;注意:(1)使用const修饰符定义常量时,必须初始化;(2)常量一旦被定义,在程序中任何地方都不能再更改。(3)如果用const定义的是一个整型常量,int可以省略。(4)与#define定义的常量有所不同,const定义的常量可以有自己的数据类型,这样C++编译程序可以进行更加严格的类型检查,具有良好的编译时的检测性。(5)函数参数也可以用const说明,用于保证实参在该函数内部不被改动,大多数C++编译器能对具有const参数的函数进行更好的代码优化。例如,通过函数max求出整型数组a[100]中的最大值,函数原型应该是:intmax(constint*pa);这样做的目的是确保原数组的数据不被破坏,即在函数中对数组元素的操作只许读,不许写。const与指针一起使用的组合情况:(1)指向常量的指针

指向常量的指针是指一个指向常量的指针变量。constchar*pc="abcd";声明指向常量的指针变量pc,它指向一个字符串常量。由于使用了const,不允许改变指针所指的常量,因此以下语句是错误的:pc[3]='x';

但是由于pc是一个指向常量的普通指针变量,不是常指针,因此可以改变pc的值。例如以下语句是允许的:pc="jkkk";(2)常指针常指针是指指针本身,而不是它指向的对象声明为常量。例如:char*constpc="abcd";//常指针这个语句的含义为:声明一个名为pc的指针变量,该指针是指向字符型数据的常指针,用“abcd”的地址初始化该常指针。创建一个常指针,就是创建不能移动的固定指针,但是它所指的数据可以改变。例如:pc[3]='x';//合法pc="dfasdfa";//不合法(3)指向常量的常指针整个指针本身不能改变,它所指向的值也不能改变。要声明一个指向常量的常指针,二者都要声明为const。例如:

constchar*constpc="abcd";//指向常量的常指针这个语句的含义为:声明一个名为pc的指针变量,它是一个指向字符型常量的常指针,用“abcd”的地址初始化该指针。以下两个语句都是错误的:pc[3]='x';//错误,不能改变指针所指的值pc="dfasdfa";//错误,不能改变指针本身变量

在C++中,变量的定义比较自由,可以出现在程序的任何位置,如:可以在for语句中定义一个变量。例:#include<iostream.h>voidmain(){

for(intnum=1;num<=100;num++){if(num%7==0)continue;cout<<num<<““;}cout<<“\n”;}

允许直接使用结构体名、联合名、枚举名定义变量。

另外,变量的初始化还可以用下面这种形式:例:intk(1),sum(0);

表示k和sum是两个整形变量,初值各为:1和0。使得局部变量的定义点与使用点不至于离得太远,增强程序的可读性,而且也不必在编写某一程序块的开始时就考虑要用到哪些变量。new和delete运算符在C语言中,使用malloc和free库函数能有效地、直接地进行动态内存的分配和释放。而在C++中,则使用关键字new和delete来达到同样的效果。动态存储空间的分配--用new运算符格式:<指针变量名>=<指针变量名>=new<类型>(<初始值>);<指针变量名>=new<类型>[<元素个数>];new<类型>;当执行new的时候,有两件事发生:大小适当的一块存储空间被分配给特定的类型变量。存储空间的首地址作为new表达式的返回值,分配失败则返回0。说明:1.对于自身需要多少存储空间未知的数据类型,如对象、数组、链表等应采用动态存储分配;2.new运算符根据对象的类型,自动决定其大小,而malloc要指定分配存储空间的大小;new返回指向此类型的指针,malloc返回指向void*类型的指针。举例:Char*pChar;pChar=newchar;char*string=newchar[25];动态存储空间的释放--采用delete运算符格式:delete<指针变量名>delete[]<指针变量名>或//释放用new创建的数组举例:deletepChar;delete[]string;说明:必须用于先前new操作分配的有效指针;对于一个指针只能执行一次delete操作;delete[]运算忽略数组的维数或方括符内的数字。voidmain(){intarraysize,*array;cout<<“Can’tallocatememory,terminating.”;cin>>arraysize;if((array=newint[arraysize])==NULL);{cout<<“pleaseinputanumberforarray:”;exit(1);}for(intcount=0;count<arraysize;count++)array[count]=count*2;{cout<<array[count]<<“”;}cout<<endl;

delete[]array;}例:在函数中如果局部变量与全局变量同名,但又希望使用全局变量,则可采用C++语言提供的作用域运算符(::)。举例:#include<iostream>floata=2.5;//全局变量voidmain(){inta=8;cout<<a<<endl;cout<<::a<<endl;//::a表示全局作用域中的变量a}程序的运行结果为:82.5注意:不能用::访问函数中的局部变量。作用域运算符(::)功能:给一个定义的变量起一个别名,用于在程序的不同部分使用两个以上的变量名指向同一地址,使得对其中任一个变量的操作实际上都是对同一地址单元进行的。定义格式:

<类型>&<引用名>=<变量名>或<类型>&<引用名>(<变量名>)其中,变量名必须是一个已经定义过的变量。举例:inta=3;int&ra=a;指针的引用--特殊数据类型ra=ra+2a=a+2所有对这个引用ra的操作,实质上就是对被引用对象a的操作。引用与指针的区别:指针是一个变量,可以把它再赋值成指向别处的地址,而引用不是值,不占存储空间,声明引用时,目标的存储状态不会改变。引用一旦被初始化,就不能再重新赋值(即其地址不会再改变)。说明:定义引用类型变量时,必须将其初始化。而且引用变量类型必须与为它初始化的变量类型相同。当引用类型变量的初始化值是常量时,则必须将该引用定义成const类型。不能引用一个数组,这是因为数组名本身不是一个真正的数据类型。可以引用一个结构体,或对指针变量的引用,例如:int*a;int*&p=a;。引用本身不是一种数据类型,所以没有引用的引用,也没有引用的指针。可以用一个引用初始化另一个引用。例如:intnum=50;int&ref1=num;int&ref2=ref1;ref2=100; //num被修改为100其中ref2也是对num的引用。

可以把函数的参数说明成引用以建立函数参数的引用传递方式。有空指针,无空引用引用不能用数据类型来初始化。如:

int&ref=int;//error函数的引用传递:如果以引用作为参数,不仅可以实现指针所带来的功能,而且更加简便自然。格式:在函数定义时将形参前加上引用运算符“&”。举例:#include<iostream.h>voidswap(int&x,int&y);voidmain(){inta(7),b(11);swap(a,b);cout<<“a=“<<a<<“,b=“<<b<<“\n”;}voidswap(int&x,int&y){inttemp;temp=x;x=y;y=temp;cout<<“x=“<<x<<“,y=“<<y<<“\n”;}结果是:x=11,y=7a=11,b=7即:形参的变化会影响到实参的值(地址传递)。引用还可以作为函数的返回值。引用表达式是一个左值表达式,因此它可以出现在形、实参数的任何一方。若一个函数返回了引用,那么该函数的调用也可以被赋值。一般说,当返回值不是本函数内定义的局部变量时就可以返回一个引用。在通常情况下,引用返回值只用在需对函数的返回值重新赋值的时候。避免将局部作用域中变量的地址返回。【例2.8】统计学生中A类学生与B类学生各为多少个。A类学生的标准是平均分在80分以上,其余都是B类学生。【例2.9】返回的局部作用域内的变量,函数作为左值。字符串除了计算外,文本处理也是编程过程中一个非常重要的方面。在C语言中使用字符数组和字符指针实现字符串,但是在C++中提供了一种既方便又好用的string类型。下面通过一个简单的例子说明string类型的使用。

【例2.10】字符串类string的使用。C++要求为每一个函数建立原型,用以说明函数的名称、参数个数及类型和函数返回值的类型。其主要目的是让C++编译程序进行类型检查,即形参与实参的类型匹配检查,以及返回值是否与原型相符,以维护程序的正确性。所以应养成将声明与定义分别编写的编程习惯。函数原型与函数的定义要在函数的返回类型,函数名和参数的类型及数量这三条线上保持一致。在写函数原型时,可以省略形参的名字,因为参数名对编译器没有意义,但如果取名恰当的话,这些名字可以起到提示参数用途的作用。函数原型(FunctionPrototype)函数--带默认形参值的函数

C++扩展了函数功能,允许在函数的声明或定义时给一个或多个参数指定默认值。这样在调用时,可以不给出参数,而按指定的默认值进行传递。如:voiddelay(intloops=1000);//函数声明…voiddelay(intloops);//函数定义{if(loops==0)return;for(intI=0;I<loops;I++);//空循环,起延时作用}

当调用:delay();时,程序都会自动将loops当作成1000值进行处理(和delay(1000)等效)。当然,也可以重新指定相应的参数值,如:delay(2000);。说明:

当函数既有声明又有定义后,不能在函数定义中指定默认参数。默认参数值可以是全局变量、全局常量、甚至是一个函数,但不可以是局部变量。因为默认参数的函数调用是在编译时确定的,而局部变量的值是在执行时确定。当一个函数中有多个默认参数时,则形参分布中,默认参数必须放置在其它形参的右边(在一个默认参数的右边不能有未指定缺省值的参数)。在函数调用时,系统按从左到右的顺序将实参与形参结合,当实参的数目不足时,系统按同样的顺序用声明或定义中的默认值来补齐所缺少的参数。//使用默认参数#include<iostream.h>doublepower(doublereal,intn=2);voidmain(){doubler=3.0;cout<<power(r)<<endl;cout<<power(r,3)<<endl;}doublepower(doublereal,intn){if(n==0)return1.0;doubleresult=real;for(inti=2;i<=n;i++)result*=real;returnresult;}//使用默认参数#include<iostream.h>doublepower(doublereal,intn=2);voidmain(){doubler=3.0;cout<<power(r)<<endl;cout<<power(r,3)<<endl;}doublepower(doublereal,intn){if(n==0)return1.0;doubleresult=real;for(inti=2;i<=n;i++)result*=real;returnresult;}定义默认参数//使用默认参数#include<iostream.h>doublepower(doublereal,intn=2);voidmain(){doubler=3.0;cout<<power(r)<<endl;cout<<power(r,3)<<endl;}doublepower(doublereal,intn){if(n==0)return1.0;doubleresult=real;for(inti=2;i<=n;i++)result*=real;returnresult;}使用默认参数power(r,2)//使用默认参数#include<iostream.h>doublepower(doublereal,intn=2);voidmain(){doubler=3.0;cout<<power(r)<<endl;cout<<power(r,3)<<endl;}doublepower(doublereal,intn){if(n==0)return1.0;doubleresult=real;for(inti=2;i<=n;i++)result*=real;returnresult;}不使用默认参数函数--内联函数

C++提升了C语言的高效特点,引入了内联函数的概念,它把函数体的代码直接插入到调用处,将调用函数的方式改为顺序执行直接插入的程序代码。这样可以减少程序的执行时间,但同时需要更多的内存空间。定义格式:

inline<类型>函数名([形参表]){…}举例:#include<iostream.h>inlinefloatfmax(floatx,floaty)//函数定义{returnx>y?x:y;}voidmain(){floata,b;cout<<“请输入两个浮点数:”;cin>>a>>b;cout<<“最大的数是:”<<fmax(a,b)<<“\n”;//调用内联函数}说明:内联函数也要遵循定义在前,调用在后的原则。形参与实参之间的关系与一般函数相同。在C++中,需要定义成的内联函数不能含有循环、switch和复杂嵌套的if语句。递归函数是不能被用来做内联函数的。不能包含goto语句、静态数据、数组。编译器是否将用户定义成内联函数作为真正的内联函数处理,由编译器自行决定。函数--函数的重载

函数重载是C++对C的扩展,它允许多个同名的函数存在,但同名的各个函数的形参必须有区别,如:形参的个数不同;或者形参的个数相同,但参数类型有所不同。若只有返回值的类型不同是不行的。

多个同名函数有不同的参数集;编译器根据不同参数的类型和个数产生调用匹配;函数重载用于处理不同数据类型的类似任务;当函数的重载带有默认参数时,应该注意避免二义性。#include<iostream.h>intab

温馨提示

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

最新文档

评论

0/150

提交评论