语言基本教程程序设计章_第1页
语言基本教程程序设计章_第2页
语言基本教程程序设计章_第3页
语言基本教程程序设计章_第4页
语言基本教程程序设计章_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第十二章C与C++12.1C转入C++时不需改变的内容12.2C转入C++的一些与类无关的新特性

12.3C++的核心新特性——类12.4面向对象程序设计12.1C转入C++时不需改变的内容(1)各种数据类型变量的定义与使用,函数、数组、指针、文件等基本知识。

(2)许多有效的算法。

(3)程序的基本调试思想方法。

(4)程序设计中的自顶向下的总体思想:

(5)程序段中具体的最小模块仍然由顺序、分支、循环三种基本模块组成。12.2C转入C++的一些与类无关的新特性12.2.1C转入C++时需改变的内容C++中不能再作为标识符的关键字2.函数声明3.函数声明的形式12.2.2C++中独有的与类无关的部分新特性1.局部变量说明语句的位置如:voidmain(){……/*程序的其它部分(包括执行语句)*/intcount=0;//变量count说明

while(++count<=100)//变量count使用

{……}

……/*后续程序*/}2.注释符

C++中可以使用两种注释符(如上例),比C多一种注释符“//”,其功能是其后至行末为注释部分。程序中可灵活选用。

3.范围分解符::

C中,当全局变量和某函数内的局部变量同名时,该函数对全局变量起屏蔽作用,即在该函数内无法访问此全局变量,而在C++中,只要在其前使用范围分解符即可访问同名的全局变量。例如:

floatn;voidmain(){intn;n=5;//给局部变量n赋值::n=5.53;//给全局变量n赋值

……

}4.内联函数内联函数的特性类似于宏。

C中,在定义了宏#defineABS(n)((n)<0?-(n):(n))之后,程序每调用一次宏ABS,替换宏名的字符串就展开并插入在调用处一次。C中的函数调用就不是这种展开方式,而是程序转入子函数执行,执行完后再返回主调函数,每个函数只有一段代码。在C++中,可以定义类似于宏的内联函数,关键字是inline,如定义求绝对值的内联函数如下:inlineintAbs(intn){returnn<0?-n:n;}5.重载函数

C++中可以在同一程序中多次定义同名函数,只要各函数间的参数个数或类型不同,例如:intAbs(intn){returnn<0?-n:n;}floatAbs(floatn){returnn<0?-n:n;}

在同一范围内定义同名函数称为重载函数。编译器根据函数调用时具体的实参的个数和类型自动调用匹配的重载函数版本。例如:intAbs(intn);floatAbs(floatn);voidmain(){inti;floatf;i=Abs(5);//调整型的求绝对值函数

f=Abs(-2.5);//调实型的求绝对值函数

……

}6.new和delete操作符以下为动态开辟内存块的例子:structnode{char*name;intsalary;node*next;};

char*pchar;//定义三种类型的指针变量

int*pint;structnode*pnode;pchar=newchar;//开辟了三块内存区pint=newint;pnode=newnode;*pchar=′a′;//为内存单元赋值*pint=6;pnode->name="hello";pnode->salary=1000;12.3C++的核心新特性——类12.3.1类以下是一个有关“人”的类的定义classCHuman//class——类定义关键字

{charname[20];//类的数据成员

intage;

voidGetInfo()//类的成员函数

{……

}voidOutInfo(){……

}};12.3.2类实例

类的定义格式与结构体类型定义格式类似,其含义也类似,均是定义了一种新的数据类型,要作为程序处理的对象。对于结构体类型,接着要定义结构体型变量以便在程序中引用(如第九章中的structstaffworker1,worker2;);对于类,则要生成类实例,又称为类对象。其地位如同变量。如在上述的CHuman类定义之后,语句:

CHumanhuman;(类名前不需加关键字class)就生成了类CHuman的实例human,即为类对象human分配了一块可以存放数据和对数据进行处理的程序代码的内存块,又称为类的实例化。

和内部变量一样,类对象在定义范围内有效(如在函数内定义的类对象,在函数返回时销毁)。一个类可以生成多个实例。也可以用C++的new操作符生成类的实例如下:CHuman*PHuman=newCHuman;这个语句分配足以放置类对象的内存块并返回其首地址给这个对象的指针。对象所占内存保持到用delete操作符释放:

deletePHuman;

C++中多用这种分配、销毁模式。12.3.3类成员的访问

例12.1

使用C语言全局变量实现有关一个人的信息的输出操作。#include<string.h>#include<stdio.h>charname[20];/*两个全局变量*/intage;voidGetInfo(){strcpy(name,"Li-Li");age=22;}voidOutInfo(){count<<"name:"<<name<<end;/*<<为输出显示符*/count<<"age:"<<age<<end;}/*下面是一些其它的函数*/function1(){……//此函数内可调用GetInfo()和OutInfo()及全局变量name[]和age}Function2(){……//此函数内可调用GetInfo()和OutInfo()及全局变量name[]和age}main(){charch;

GetInfo();OutInfo();

……

}图12.1C程序中全局变量不安全性例12.2

用C++语言定义一个有关人的“类”classCHuman//class——类的定义符

{private://以下为私有变量,可以也只能由该类的成员函数调用

charname[20];

intage;

public://以下为公有函数,此类内外的函数均可以调用它们

intGetInfo(){……

}intOutInfo(){……

}};//类定义结束图12.2类对私有数据成员的封装怎样正确地调用类成员:main(){CHumanhuman;//定义了一个CHuman类的对象

strcpy(,"Li-Li");//错误:不能访问私有数据成员

human.age=22;//错误:同上

human.GetInfo();//正确:可以访问公有成员函数

human.OutInfo();//正确:同上

}12.3.4构造函数

在定义一个类时,直接初始化数据成员是不允许的。下列类的定义的初始化会产生错误:classC{private:

intn=0;//出错

int*pi=&n;//出错

……

};

其实,在类的定义中初始化是没有意义的,它只是创建了一个模板,类似于C语言中的结构体类型的定义,而程序是不可以直接对类型操作的,只能对定义在其上的变量操作。所以想要初始化成员,就必须生成一个类的实例。例如:……//其它程序voidCHuman::initial(charname[20],intage)//定义一初始化函数{strcpy(name,"");age=0;}……//其它程序CHumanhuman;//生成了一个CHuman类的实例humanhuman.initial(name,age);//初始化类实例human

初始化成员变量的更好办法是定义一个特殊的成员函数:“构造函数”。classCHuman{private:

charname[20];

intage;

public:

CHuman()//定义构造函数,它的名称与类的名称一样{strcpy(name,"");age=0;}voidGetInfo(){……

}voidOutInfo(){……

};}12.3.5析构函数

析构函数也是自动执行的,但它与构造函数相反,是在程序结束时执行,它负责在程序撤消类的对象时,释放所占资源。例如:

~CHuman()//定义析构函数

{deletename;//释放name所占内存

}

析构函数的名称为构造函数名称前加“~”例12.3CHuman类的完整定义classCHuman{private:

charname[20];intage;

public:

CHuman()//定义构造函数

{strcpy(name,"");age=0;}voidGetInfo(){……}voidOutInfo(){……}~CHuman()//定义析构函数

{deletename;}};12.3.6类的继承

类的最重要的特性是继承性,它很贴近现实世界,如:儿子继承父亲的一些特征,并且拥有自己的特征。孙子又继承了儿子的一些特征,并且拥有自己的特征……。类也一样,它的一些特性是可以继承的。下面我们将前面的有关人的类增加一些数据成员,并派生出一个“学生”的类:classCHuman//重新定义一表示人的类CHuman{private:char*m-name;intm-age;char*m-sex;floatm-height;public:CHuman()//定义构造函数

{m-name="";m-age=0;m-sex="";m-height=0.0;}voidGetInfo(char*name,intage,char*sex,floatheight){m-name=newchar[strlen(name)+1];m-name=name;m-age=age;m-sex=sex;m-height=height;}voidprint(){cout<<"Name:"<<m-name;cout<<"Age:"<<m-age;cout<<"Sex:"<<m-sex;cout<<"High:"<<m-height;}~CHuman()//定义析构函数

{deletem-name;deletem-sex;}};

以上是一个“人”的类,现在,我们需要描述一个学生的一些特征。当然,学生是属于“人”的,所以,有关人的特性我们不应该重复,可以从“人”的类中“派生”出我们所要定义的“学生类”,继承“人”类中所有的属性,再增加些学生特有的属性,定义“学生类”如下:classCStudents:publicCHuman//表示类CStudents是从类Chuman 中公有派生的

{private://学生类所具有的新的属性

char*m-schoolname;//校名

intm-grade;//年级public:voidprintstu(){cout<<"Schoolname:"<<m-schoolname;cout<<"Grade:"<<m-grade;}voidGetStuInfo(char*schoolname,intgrade){m-schoolname=newchar[strlen(schoolname)+1];m-schoolname=schoolname;m-grade=grade;}CStudents()//定义构造函数

{m-schoolname="";m-grade=0;}~CStudents()//定义析构函数

{deletem-schoolname;}};图12.3基类及其派生类的成员可访问图12.4面向对象程序设计12.4.1从面向过程到面向对象12.4.2什么是面向对象

面向对象程序设计是面向对象理论在程序设计中的应用,面向对象理论的应用范围则更广。面向对象系统有三大特性:封装性、继承性和多态性。面向对象的概念可以由如下公式表示:面向对象=对象+类+继承+通信1.对象在面向对象的系统中,对象是基本的、运行时的实体,它既包括数据(属性),也包括作用于数据的操作(行为)。所以一个对象把属性和行为密封成一个整体。从程序设计者来看,对象是一个程序模块;从用户来看,对象为他们提供了所希望的行为。2.类

一个类定义了一组大体上相似的对象。一个类所包含的方法和数据描述了一组对象的共同行为和属性。把一组对象的共同特性加以抽象并存贮在一个类中的能力,是面向对象技术最重要的一点。类是在对象之上的抽象。有了类以后,对象则是类的具体化,是类的实例。类可以有子类,同样也可以有父类,形成层次结构。3.继承性继承性是父类和子类之间共享数据和操作的机制。这是类之间的一种关系,在定义和实现一个类的时候,可以在一个已经存在的类的基础上进行,把这个已经存在的类所定义的内容做为自己的内容,并加入若干新的内容。继承性是面向对象程序设计语言的标志。它使程序的可重用性大大提高。因为程序员只要对已有的类加以整

温馨提示

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

评论

0/150

提交评论