数据结构(5顺序表类.ppt_第1页
数据结构(5顺序表类.ppt_第2页
数据结构(5顺序表类.ppt_第3页
数据结构(5顺序表类.ppt_第4页
数据结构(5顺序表类.ppt_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

C/C+与数据结构 郭 鹏 城市与环境科学学院 1 5. 顺序表类 C+预备知识 发展由来 输入输出 内联函数、缺省函数 函数重载、运算符重载 引用型、布尔型 C基本顺序表到C+顺序表类 2 5. 顺序表类 C+发展由来 C 丹尼斯里奇 cout /键盘输入,显示器输出(printf,scanf) cin.get();cout.put()/字符输入输出(getchar,putchar) cin.getline(para1,para2,para3)/字符串输入(gets) 输入(para2-1)个字符 para3,输入的终止字符 cout.write(para1,para2)/输出(puts) para1:输出字符来源; para2: 输出字符个数 #include void main () char m20; cin.getline(m,5);/, C); cout0?)1:0); 8 (i %20?)1:0) /直接替换 5. 顺序表类 内联函数 内联函数和宏很类似,只是在需要用到的时候,内联函 数像宏一样的展开,所以取消了函数的参数压栈,避免 了频繁调用函数对栈内存重复开辟所带来的消耗,减少 了调用的开销。 既然这么好?是不是都可以把函数都声明为Inline? 9 5. 顺序表类 内联函数的局限 只适合函数体内代码简单的函数使用 不能包含循环、条件、选择等复杂的结构控制语句,例 如while/switch/for 必须在声明函数的代码文件中进行函数定义 真相-Truth 即便你没有指定函数为内联函数,有的编译系统也会自 动将很简单的函数作为内联函数处理;而对于复杂的函 数,即便你指定他为内联函数,系统也不会理会的 Inline只是请求!编译器负责实现! 10 5. 顺序表类 内联函数与宏定义的区别 宏定义#define:简单的字符串替换,不考虑参数类型 宏的参数替换是不经计算而直接处理的,而函数调用是将实参 的值传递给形参 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函 数是编译之后,在执行时,才调用的.因此,宏占用的是编译的时 间,而函数占用的是执行时的时间 C+中基本不会使用#define,而是用const取代 #define只是简单替换 const会进行类型检查 11 5. 顺序表类 默认函数 指带有默认参数的函数 默认参数:在函数声明时就带有一个默认值,当调用该函 数时,如果不给出相应的实参,则编译器将默认值赋给这个 参数 主要用于默认构造函数 12 u带有默认值的形参必须从参数列表最右边开始 连续不断列出 void func(int x=0,int y,int z=0) 【】 u如果函数由声明和定义两部分,默认值只能出 现在函数声明中 5. 顺序表类 函数重载 三个结构中的求长基本操作 Int ListSize(const SeqList * l)/基本顺序表 Int QSize(const Queue * q)/基本顺序队列 Int StSize(const Stack * s)/基本顺序栈 如果更多结构?WhatSize? 13 int Size() 5. 顺序表类 Size函数重载 Int Size(const SeqList * l)/基本顺序表 Int Size(const Queue * q)/基本顺序队列 Int Size(const Stack * s)/基本顺序栈 函数表名和函数有一处不同,就表示函数不同 因为函数参数表的不同,构成了函数重载 注意: 如果只有返回值不同,则不能重载 如果两个函数的参数个数相同且类型可隐式转换,尽量 不要重载,因为会容易出现二义性 void display(char a); void display(double a); Display(10)/出现二义性 14 5. 顺序表类 函数重载 #include void display(char); void display(int);/注意匹配提升 void display(char,char); void main() display(65); display(A); display(A,B); 15 void display(char ch) coutsize; i+) if(L-datai=item) /非法语句 return i; return (-1) 如果想用“=”来比较,应该如何做呢? 16 error C2676: binary = : const struct student does not define this operator 5. 顺序表类 运算符重载 运算符重载就是赋予已有的运算符多重含义。C+中通 过重新定义运算符,使它能够用于特定类的对象执行特 定的功能,这便增强了C+语言的扩充能力。 把运算符看做是函数,函数名为operator,为运算符 int operator=(student a,student b) return(a.ID=b.ID); 重载后:优先级不变;结合律不变;操作数个数不变; 语法结构不变 17 5. 顺序表类 运算符重载 好处是什么?面向问题,而不是面向机器或具体数据结 构。 不允许重载的运算符 “ ”,“ * ”, “ : ” , “?:” 限制 不可臆造新的运算符 坚持4个“不能改变” 不能改变运算符操作数的个数 不能改变运算符原有的优先级 不能改变运算符原有的结合性 不能改变运算符原有的语法结构 18 原则: (1) 重载运算符含义必须清楚。 (2) 重载运算符不能有二义性。 应有一个参量是用户 自定义类型,不能全 部是语言固有的类型 5. 顺序表类 运算符重载 提供了C+的可扩展性,是C+最引人的属性之一 在完成同样的操作的情况下,如果运算符重载能够比用 明确的函数调用使程序更清晰,则应该使用运算符重载 不能过度或不合理地使用运算符重载,因为这样会使程 序语义不清楚且难以阅读 用于类的对象的运算符必须重载(赋值运算符=和 地址运算符 Int 引用必须初始化;不能声明引用数组 20 5. 顺序表类 引用参数 传统上C中是通过值和地址进行参数传递 C+更多使用引用调用 引用调用 Int operator=(Student 形参是实参的引用,即为引用调用 如果不改变参数值,则设为常量型引用 Int operator=(const Student int 不能有NULL引用,但可以有NULL指针 int *p = NULL 一旦引用被初始化,就不能改变引用的关系,指针则可 以随时改变所指的对象 23 对n的任何操作就是对m的操作,n既不是 m的拷贝,也不是指向m的指针,其实n就是 m自己 void Func ( int *A ) int B = 9; A = void Func ( int A = B; Int C = 10; Func( Int C = 10; Func(C); 5. 顺序表类 C+中的三种函数调用 值传递 指针传递 引用传递 24 void Func1 ( int A ) A += 10; Int n = 0; Func1(n); Cout C+顺序表类 Excellent Language != Excellent Code Excellent Programmer = Excellent Code 代码组织 构造函数 基本操作函数声明 功能函数定义 C语言编译器没有区分以上函数,声明、定义、调 用方式相同 C+则从概念和语法上把上述3类函数进行区分 26 5. 顺序表类 C基本顺序表的C+改造 bool类型定义-返回值为真/假的函数值定义为bool类型 宏常量改为const常量 #define MaxSize 100 const int MaxSize = 100 形参值调用 常量型引用调用 InsertRear(SeqList * L, Type item) InsertRear(SeqList * L, const Type struct SeqList Type DataMaxSize; int size; void SetList(void); /构造函数 int Size(void) const; /常量型成员函数 bool Empty(void) const; void InsertRear(const Type const Type void Erase(int id); void Error(const char* c); 29 5. 顺序表类 C基本顺序表的C+改造 调用方式的改变 Erase(= SeqList(void);/不可以有返回值 30 5. 顺序表类 C基本顺序表的C+改造 访问权限设置 私有 private:对外隐藏,成员函数可访问 公有 public:对外对内都开放,任何函数可直接访问 new和delete运算符 new负责调用构造函数 delete释放动态数组需要加下标运算符,delete 31 5. 顺序表类 C基本顺序表的C+改造 Class-类 类的默认项为私有,结构为公有 结构与类的使用选择 结构:不含成员函数 类:数据成员被封

温馨提示

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

评论

0/150

提交评论