[工学]c+ 第3讲new

上传人:tia****nde 文档编号:70929643 上传时间:2019-01-19 格式:PPT 页数:100 大小:1.23MB
返回 下载 相关 举报
[工学]c+ 第3讲new_第1页
第1页 / 共100页
[工学]c+ 第3讲new_第2页
第2页 / 共100页
[工学]c+ 第3讲new_第3页
第3页 / 共100页
[工学]c+ 第3讲new_第4页
第4页 / 共100页
[工学]c+ 第3讲new_第5页
第5页 / 共100页
点击查看更多>>
资源描述

《[工学]c+ 第3讲new》由会员分享,可在线阅读,更多相关《[工学]c+ 第3讲new(100页珍藏版)》请在金锄头文库上搜索。

1、1,第三章 类,2,FTP,ftp:/10.37.13.226 用户名:lcp 密码:无,3,类和对象,在C+中,一个类就是一种数据类型。 标准C+定义了一些内建的类,例如string。 通过创建自己的类,程序员可以对C+语言进行扩展。 通过类声明可以创建一个类,而且可将这个类当作数据类型来使用。,4,类和对象,类声明: 描述了封装在该类中的数据成员(data member)和成员函数(function member) 例如: 其中: class是个关键字,Human称为类标签 通过类声明创建了一个数据类型,类标签是该数据类型的标识符或名字。 类声明中的花括号“”后的分号“;”不可少。,5,类

2、和对象,对象定义: 从面向对象程序设计的角度来看,在C+中以一个类(如Human)作数据类型定义的变量就是对象。 例如,如下语句定义了Human的一个对象maryLeakey 定义对象时,关键字class是可有可无的,只要首先给出Human类的声明,就可通过以下两种方式定义Human类的对象:,6,类和对象,定义对象数组:,7,C+的信息隐藏机制,三个关键字: private:可用来隐藏类的数据成员和成员函数 public:用来暴露类的数据成员和成员函数 protected 面向对象设计的灵魂就是使用private隐藏类实现,使用public暴露类的接口。,8,C+的信息隐藏机制,定义一个Pe

3、rson类 接口:包含两个公有成员函数setAge和getAge。 实现:一个unsigned类型的数据成员age。,9,C+的信息隐藏机制,private成员和public成员可以在类声明中交叉出现。,10,C+的信息隐藏机制,Person类的客户(指Person类的对象的使用者)可通过调用公有成员函数setAge和getAge来请求Person类提供服务 Person类的客户不能访问属于类实现部分的私有数据成员age,11,成员选择符,成员选择符.和指针操作符-,可对类的数据成员和成员函数进行访问。,12,成员选择符,对象的使用者只能访问类的公有成员(数据成员或成员函数)。,13,类范围,

4、类的私有成员仅能由类的成员函数访问,即具有类范围性质。 类的公有成员拥有公有范围性质,可以在类之外进行访问。,14,类范围,在C+中,用关键字class声明的类,其类成员在默认情况下作为私有成员处理,具有类范围性质。 因此,如下两个声明是等价的,15,关键字class和struct的区别,使用class关键字或struct 关键字都可以创建类。 如果使用class关键字,类成员在默认状态下是私有的; 而使用struct 关键字,类成员在默认状态下则是公有的。 如下两种声明方式是等价的:,16,类成员函数的定义,类成员函数的定义方法: 在类声明之外进行定义 在类声明之中进行定义(inline),

5、17,类成员函数的定义,在类声明之外进行定义 为避免重名,在定义成员函数时使用了域解析符:,18,类成员函数的定义,在类声明之中进行定义(inline),19,类成员函数的定义,通过在进行成员函数声明的时候使用inline关键字,可将原本定义在类声明之外的成员函数强制变成内联函数。,20,在程序中使用类,关键步骤: 类声明 对象定义 客户服务请求。,21,在程序中使用类,通常将类声明放到.h中,这样在使用时通过#include将类声明包含进来。 如可将Person类的声明放到person.h文件中 通常将成员函数的定义放到.cpp 中 如可将Person类的定义放到person.cpp中 一般

6、不要将成员函数的定义放在.h文件中,因为头文件通过#include被多个不同的文件所包含的话可能出现函数重复定义错,22,示例程序:堆栈类,问题:创建一个支持int型的压入和弹出操作的堆栈类。 公有成员: 对stack对象进行初始化。 检查stack为空,或已满。 将整数压入到stack中。 从stack里弹出整数。 不移出任何元素,将stack的内容输出到标准输出。 私有成员: 一个用于打印错误信息的私有成员函数。 三个私有数据成员(top、数据数组、dummy_val),23,24,25,效率和健壮性,通过引用来传递和返回对象 const类型参数的对象引用 const成员函数 对成员函数进

7、行重载以便处理两种类型的字符串,26,通过引用来传递和返回对象,对象可以采用传值方式或引用方式进行对象的传递和返回。 一般来说应该采用引用方式进行对象的传递和返回,而不要采用传值的方式来进行 因为通过传值方式来传递和返回对象时会降低效率并将面临对象间的拷贝操作,从而使数据增大,浪费内存。 从效率上看,传递一个指向对象的指针可收到与引用方式相同的效果,但引用方式的语法要简练得多。,27,28,const类型参数的对象引用,通常,如果一个对象通过引用方式传到函数f中,而函数f又不会通过修改对象的数据成员的值改变该对象的状态,那么,最好将f的参数标记为const ,可以预防对参数的误写,同时有些编译

8、器还可对这种情况进行一些优化。 如下例:将函数setName的string类型参数n标记为const,表明setName不会改变n,只是将n赋值给数据成员name。,29,const成员函数,如果一个成员函数不需要直接或间接(通过调用其他的成员函数来改变其对象状态)地改变该函数所属对象的任何数据成员,那么最好将这个成员函数标记为const 。 如下例,由于get成员函数不需要改变类C的任何数据成员,因此将get成员函数标记为const。,30,const成员函数,定义一个const成员函数时,const关键字出现在参数列表与其函数体之间。 由于get成员函数不更改任何数据成员,因此这种类型的函

9、数被称为只读函数。 将成员函数标记为const可以预防对该函数所属对象的数据成员的误写,同时有些编译器还可对这种情况进行一些优化。 一个const成员函数仅能调用其他const成员函数,因为const成员函数不允许直接或间接地改变对象的状态,而调用非const成员函数可能会间接地改变对象的状态。,31,const成员函数,const关键字三种不同用法示例 在成员函数set中,因为set不改变string类型参数n,n被标记为const。 成员函数get返回数据成员name的一个const型引用,此处的const表明谁也不能通过这个引用来修改数据成员name的值。 成员函数get本身被标记为co

10、nst,因为get不会改变类C惟一的数据成员name的值。,32,const 返回,某函数如果采用const返回,则其返回值只能赋给一个const类型的局部变量. 如果该const返回值是一个类的指针或者引用的话,则不能用该指针或引用调用该类的 non-const成员函数,因为这些函数可能会改变该类的数据成员的值。,33,const 返回,34,const 返回,35,对成员函数进行重载以便处理两种类型的字符串,36,示例程序:时间标记类,时间标记是一个数值,用来记录某个瞬间时间。 时间标记可用于记录某件事情发生的时间。例如,在商务活动中,可用一个时间标记记录到货时间,用另一个时间标记记录发款

11、时间。 创建一个TimeStamp类来完成如下操作: 事件发生时记录一个时间标记。 将时间标记作为整数打印。 将时间标记作为字符串打印。 将一个时间标记分解为年、月、日、小时、分钟和秒,并可分别打印。,37,示例程序:时间标记类,TimeStamp类可作为一个实用类为其他类提供计时服务。 例如,Invoice类拥有两个TimeStamp类型的数据成员,一个用于记录发货时间,另一个用于记录到款时间:,38,示例程序:时间标记类,测试程序: 创建了一个名为ts的TimeStamp对象,并通过ts来调用TimeStamp的各种成员函数。 分别以整数和字符串方式输出TimeStamp,然后将字符串方式

12、的TimeStamp分解为年、月、日(星期形式)、时、分和秒等子串并输出。,39,40,示例程序:时间标记类,C+标准库函数time和ctime(在头文件ctime中)。 库函数time以算术值的形式返回当前时间。 库函数ctime可将一个从time函数返回的值转换成人类可读的字符串(如Mon Apr 1 11:45:07 1999)。,41,示例程序:时间标记类,函数time 的原型为: 返回值:返回从((00:00:00),January 1,1970)开始到现在(系统时钟)所过的总秒数。 返回值存储在参数timer中,如果该参数为NULL的话, 返回值不保存。 Example time_

13、t timebefore, timeafter; timebefore = time(0); for(int i=0; i10000;i+) couti; timeafter = time(0); cout timeafter timebefore;,42,示例程序:时间标记类,函数ctime 的原型为: 返回值:ctime函数接收一个time_t 类型变量的地址,返回一个C风格字符串 通常,我们首先调用time来设置一个time_t类型的变量,然后将该变量的地址传给ctime,来得到一个C风格字符串,43,示例程序:时间标记类,Ctime返回的字符串通常采用如下格式: 最前面三个字符表示星期

14、几,如Tue。 第四个字符是一个空格。 从第五个字符到第七个字符表示月份,如Jul。 第八个字符是一个空格。 第九个字符和第十个字符表示是该月的第几天,如21。 第十一个字符是一个空格。 第十二和十三个字符表示小时,从00(午夜)到23(11P.M.)。 第十四个字符是一个冒号。 第十五和第十六个字符表示分钟,从00到59。 第十七个字符是一个冒号。 第十八和十九个字符表示秒,从00到59。 第二十个字符是一个空格。 第二十一到第二十四个字符表示年份,如1999。 第二十五个字符是一个换行符。 第二十六个字符是一个null结束符。,44,示例程序:时间标记类,借助以上信息,可从所返回的字符串中

15、提取任何需要的部分。例如, TimeStamp 类中用于获取年份的getYear函数为: getYear函数调用私有成员函数extract ,并传给它两个变量,这两个变量指出希望获取的子串在原字符串中的起始位置及子串的长度。,45,46,示例程序:时间标记类,TimeStamp 类采用面向对象模式对标准库中已经提供的一些函数进行包装,以实现信息隐藏和信息封装。 TimeStamp仅仅封装了一些已有的函数,并未增加什么全新的功能,对于这种类型的类,我们称之为瘦包装器(thin wrapper)。,47,构造函数与析构函数,有些函数比较特殊,在调用它们时不需要显式地提供函数名,编译器会自动地调用它

16、们。 类构造函数(class constructor,可有多个)和类析构函数(class destructor,最多一个)就是这种类型的函数,通常编译器会自动调用这两个函数而不需要我们显式地发出调用动作。,48,构造函数与析构函数,构造函数:是一种与类名相同的成员函数。当创建类的一个实例时(例如,定义一个类的变量时),编译器会自动地调用某个合适的构造函数。 下例中:三个成员函数是构造函数,都有着与类相同的名称Person,而且没有返回类型。,49,构造函数与析构函数,构造函数不能有返回类型,因此如下声明是错误的: void Person() ; 一个类可以拥有多个构造函数,也就是说,可以对构造函数进行重载。但每个构造函数必须拥有不同的函数签名。 如上例中,三个构造函数具有不同的函数签名: 第一个没有参数(默认构造函数) 第二个的参数类型为const string引用(带参构造函数) 第三个的参数类型为C风格字符串:const char*(带参构造函数),50,构造函数与析构函数,构造函数的使用:,51,构造

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号