ImageVerifierCode 换一换
格式:PPTX , 页数:291 ,大小:4.48MB ,
文档编号:3514724      下载积分:32 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-3514724.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(三亚风情)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(c++程序设计-现代方法课件.pptx)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

c++程序设计-现代方法课件.pptx

1、第一章 引论C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第一章 引论21.1 C+程序概貌/helloworld.cpp#includeintmain()std:cout Hello,world!std:endl;return0;/*helloworld.c*/#includeintmain()printf(Hello,world!n);return0;VSC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第一章 引论31.2 面向对象的基本概念现实中的对象计算机中的对象面向过程面向对象客观存在特定类型的内存以过程为中心以对象为中心C+程序设计-现代方法电子科技大学信

2、息与软件工程学院 白忠建第一章 引论41.2 面向对象的基本概念面向过程 VS 面向对象typedefstructintyear,month,day;date;voiddate_create(date*,int,int,int);voiddate_add_day(date*,int);classdateprivate:intyear,month,day;public:date(int,int,int);voiddate_add_day(int);VS过程/函数为中心对象是参数(从属地位)对象是主体行为(函数)是从属C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第一章 引论51.2

3、 面向对象的基本概念1.2.2 面向对象的核心概念面向对象数据封装继承多态泛型对象的属性和行为封装在一个闭包“类”中新类从已有类扩展而出一个接口,多种实现以类型无关的方式编码C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第一章 引论61.2 面向对象的基本概念1.2.2 面向对象的核心概念 数据封装面向对象数据封装继承多态泛型未封装的封装的 所有属性对外暴露 方法不属于对象 对象是方法的参数a1a2a3m1m2 属性被分类保护 方法从属于对象 对象发起动作(方法)a2a1m1m2a3VSC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第一章 引论71.2 面向对象的基

4、本概念1.2.2 面向对象的核心概念 继承面向对象数据封装继承多态泛型非继承的继承的 组合/聚集 硬边界 在原基础上扩展 软/无边界VSC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第一章 引论81.2 面向对象的基本概念1.2.2 面向对象的核心概念 多态面向对象数据封装继承多态泛型非多态的多态的 硬编码 ifelse if/switchcase 统一接口 自动匹配VS虚接口C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第一章 引论91.2 面向对象的基本概念1.2.2 面向对象的核心概念 多态面向对象数据封装继承多态泛型实类型的泛型的 硬编码 类型由程序员掌控

5、类型参数化 类型由编译器自动推导VS模板C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第一章 引论101.2 面向对象的基本概念1.2.3 OOA/D/POOAOODOOP第二章 C+:一个更好的CC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C 带千分位分隔符的二进制常量inta=0b1010101;原始字符串/*是分隔符。符号串n不再是转义字符,而是它们本身constchar*s2=R*(onentwo)*;utf-8编码的字符串constchar*s3=u8Unicode Characters:u4e2du6587;用户自定义字面常量。

6、这实际上是个运算符函数。/功能:将度数转换为弧度数。longdoubleoperator_d2r(longdoubledegree)returndegree*3.14/360.0;sin(30.0_d2r)122.1 基础类型2.1.1 增强的字面常量C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C132.1 基础类型2.1.2 bool类型bool类型值域条件表达式逻辑表达式选择条件循环条件与整型的关系无原生类型,用整型替代0=假,任何非0值=真整型值整型值整型值整型值N/AVSC+C原生false,truebool类型结果bool类型结果bool类型结

7、果bool类型结果不等价,须转换C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C142.1 基础类型2.1.3 强类型枚举常量的作用域常量可重名与整型的关系tag名类型超前声明全局no常量默认为整型不能作为类型名,须与关键字enum一起使用noVS强类型枚举enumclassSIDELEFT,RIGHTC风格枚举enumSIDELEFT,RIGHT被限制,使用时须加名字限SIDE:LEFTyes不等价,须转换类型名yesC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C 指针inta=1;int*p=&a;内存重解释in

8、ta=1;char*q=(char*)&a;空指针int*t=nullptr;152.2 地址类型2.2.1 指针类型0 x410 x420 x430 x44apqp=int:0 x44434241q=char:0 x41,0 x42,0 x43,0 x44,ABCCC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C162.2 地址类型2.2.1 指针类型2.2.1.3 指针使用的问题inta5,*p=a;p6=0;指针越界intmain()int*p=newint5;return 0;内存泄漏voidf()int*p=newint5,*q=p;delete

9、p;q0=0;delete q;悬空指针?p?pqC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C 定义inta=1;int&r=a;含义对象的别名172.2 地址类型2.2.2 引用类型VS引用inta=1;int&r=a;指针inta=1;int*p=&a;1&aap1arr和a是同一个对象(的不同名字)p和a是两个不同的对象C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C182.2 基础类型2.2.2 引用类型定义方式含义用途对象生命期inta=1;int&r=std:move(a);对象的别名标识临时对象exp

10、iringVS左值引用右值引用inta=1;int&r=a;对象的别名标识常规对象持久注:C+中的所有具名对象对不能直接绑定到右值引用上C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C 独立引用不常用 引用常用于函数的参数和返回值类型voidf(int&a);voidg(int&b);int&h();int&k();192.2 基础类型2.2.2 引用类型C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C202.3 类型自动推导decltype&autodoublef()return0.0;autox=5;/x的类型由初

11、始化值5的类型确定。因为字面常量5的编译器默认类型是int,所以x的类型就是intauto*px=&x;/px的类型是int*staticautoy=0.0;/y的类型是doubleautoz=f();/z的类型是f()的返回值类型,即doubleautointr;/error,auto不再是存储分类符decltypeautodoublef()return0.0;/函数定义inti=0;decltype(i)j;/j的类型从对象i的类型推到而来,即是intdecltype(i)ri=i;/括起对象i的圆括号指明ri的类型引用,本例是constint&doublel=1.0;decltype(f

12、()k;/k的类型是f()的返回值类型,即doubledecltype(f()rl=l;/rl的类型是constdouble&char*p;decltype(p)q=nullptr;/q的类型是char*,并被初始化C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C 动态内存分配 new/new delete/delete 类型转换 static_cast const_cast dynamic_cast reinterpret_cast 获取类型信息 typeid#include212.4 运算符和表达式2.4.1 C+特有的运算符C+程序设计-现代方法电子

13、科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C lambda表达式 一种轻量级匿名函数 属于闭包(closure)类型 语法捕获列表(参数列表)-返回值类型 复合语句 示例auto square=(intx)-intreturnx*x;std:coutint returna+b;返回类型自动推导autof(inti)if(i=0)return1;/根据整形常量1的类型,编译器推导出f的返回类型是intelseif(i=0)return0;/OKelsereturn-1.0;/error,每条路径返回的类型不一样322.7 函数2.7.3 函数的返回值C+程序设计-现代方法电子科技

14、大学信息与软件工程学院 白忠建第二章 C+:一个更好的C 结构化绑定structXinta;doubleb;Xf()return1,2.3;auto a,b=f();/对象a/b不能提前声明/定义 函数返回lambdaauto f()return(int a)-int return a*a;autosquare=f();/square是一个lambdasquare(3);/9f()(3);/9332.7 函数2.7.3 函数的返回值C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C 当两个或多个在相同范围内的声明用的是同一个名字时,这个名字就被称为“重载(o

15、verloading)”doubleabs(doublenum)longabs(longnum)intabs(intnum)区分不同重载版本的唯一依据是函数的参数列表,即重载函数必须在参数个数和/或参数类型不同。仅返回值类型不同不能被视为是函数重载。342.7 函数2.7.4 函数重载C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的C 作为另一个函数的参数的函数称为回调函数(callback)。如果回调函数返回bool值,则它往往又被称为谓词(predicate)。示例voidf(void(*callback1)();/callback1是一个指针,其类型是

16、函数指针voidg(voidcallback2();/callback2是一个函数,其类型是函数。/以上两个函数的参数虽然类型不同,但却是等效的。352.7 函数2.7.5 回调函数C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的Ctypedefvoid(*FUN_PTR)();/FUN_PTR是指向函数的指针类型的名字,不是对象名typedefvoidFUN();/FUN是函数类型的名字,不是对象名或者usingFUN_PTR=void(*)();usingFUN=void();voidg(FUN_PTRp)(*p)();/还可以写成:p();/voidg

17、(FUNp)p();/FUN类型参数与FUN_PTR类型参数等效FUN_PTRh()returnf;/FUNh()returnf;/error362.8 类型声明简化typedef和usingC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的Ctypedefvoid(*FUN_PTR)();/FUN_PTR是指向函数的指针类型的名字,不是对象名typedefvoidFUN();/FUN是函数类型的名字,不是对象名voidg(FUN_PTRp)(*p)();/还可以写成:p();/voidg(FUNp)p();/FUN类型参数与FUN_PTR类型参数等效FUN_

18、PTRh()returnf;/FUNh()returnf;/error372.8 类型声明简化usingC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第二章 C+:一个更好的CnamespacemyspacestructX;/类型定义usingXPTR=X*;/类型别名voidf();/函数定义intcounter=0;/对象定义和初始化myspace:Xx;或者using namespace myspace;Xx;382.9 名字空间第三章 类:面向对象的基石C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石usingvalue_t=int;

19、/类型别名struct_node/节点类型定义value_tdata;/数据域_node*next;/指针域;usingnode_ptr=_node*;/类型别名structlinked_listnode_ptrhead,tail;/头尾指针size_t_size;/节点数目;403.1 案例-链表的实现3.1.1 案例及其实现链表的设计12345headtail链表图3-1链表结构示意图C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石/链表的操作:原型声明/初始化链表externvoidinit(linked_list&l);/在链表尾部添加数据exte

20、rnvoidpush_back(linked_list&l,value_td);/清空链表externvoidclear(linked_list&l);413.1 案例-链表的实现3.1.1 案例及其实现链表的操作(原型)C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 Makefilesources=*.cppcflags=-std=c+17-Walltarget=llistsanitizer=-fsanitize=addressall:$(CXX)$(sources)$(cflags)$(sanitizer)-o$(target)命令行$make423

21、.1 案例-链表的实现3.1.1 案例及其实现项目建造C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 对象是一个主动的实体,它包含有属性和行为。linked_list只是封装了属性。属于对象的行为不得不用一些没有任何隶属关系的全局函数来实现。从逻辑、安全等各种角度出发,链表的内部细节应该是对客户程序员隐蔽的,他们不需要也没有必要知道链表的实现细节。然而在实现中,链表的属性是没有任何保护的,直接暴露在程序空间中。433.1 案例-链表的实现3.1.2 案例问题分析C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石clas

22、slinked_listprivate:node_ptrhead,tail;size_t_size;public:voidinit();voidpush_back(value_td);voidclear();size_tsize();443.2 类3.2.1 定义类类型和对象数据成员成员函数C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 在类外定义void linked_listlinked_list:init()head=tail=nullptr;_size=0;在类内定义class linked_listpublic:void init()head=

23、tail=nullptr;_size=0;453.2 类3.2.1 定义类类型和对象 成员函数的定义名字限定C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 定义类对象linked_list l;访问对象的成员l.init();463.2 类3.2.1 定义类类型和对象 定义类对象headtail图3-3对象的内存布局_sizeC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 C+编译器会为每一个类对象的所有非静态(3.2.3节)成员函数设置一个thisthis指针,并且这个指针指向了类对象本身。例如有:linked_

24、list l;那么l对象的this指针可以形式化地看作是这样定义的:linked_listlinked_list *const this=&l;const this=&l;有了this指针,成员init()的实现可以认为被编译器改成如下形式 void linked_list:init()this-this-head=this-tailhead=this-tail=nullptr;this-this-_size_size=0;因此,即使所有类对象都共享了init()成员的代码,但因this指针的存在,init()也非常清楚自己是由哪个对象(this指针指向的对象)发起的。473.2 类3.2.1

25、 定义类类型和对象 this指针C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石classlinked_listprivate:node_ptrhead,tail;size_t_size;public:voidinit();voidpush_back(value_td);voidclear();size_tsize();483.2 类3.2.2 访问控制私有段,段内成员类外不可见,即类外不可直接访问。共有段,段内成员类外可见访问控制保护的是类,而非单个类对象。因此,在类的成员函数中,可以直接访问该类对象的所有成员。C+程序设计-现代方法电子科技大学信息与软

26、件工程学院 白忠建第三章 类:面向对象的基石using callback=void(value_t&);/定义函数类型voidlinked_list:traverse(callback af)for(node_ptrp=head;p!=nullptr;p=p-next)af(p-data);l.traverse(value_t&v)std:cout v ;);493.2 类3.2.2 访问控制封装遍历操作C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石class fooprivate:int a;staticstatic int b;public:stat

27、icstatic int c;void set(int x)a=x;staticstatic void f()std:cout b c std:endl;staticstatic void g(const foo&oconst foo&o)std:cout o.a std:endl;int foo:b=0;int foo:b=0;int foo:c=1;int foo:c=1;503.2 类3.2.3 类的静态成员实例成员。对象存在该类成员才存在。静态数据成员。该类成员的存在不依赖于类对象。静态成员属于类而非类对象。静态成员函数。主要用于访问其他静态成员。静态成员函数没有this指针。静态成员

28、函数要访问实例成员,应该向它传递一个对象。静态数据函数的内存分配必须在类外显式完成,并被初始化。C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 struct和union都是特殊的类。在缺省段描述符的情况下,struct的成员都是公有的。相较而言,class的则是私有的。union的成员只能是公有的。最好以C的方式使用。513.2 类3.2.4 struct和unionC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 类的成员可以是其它类的实例。这使得前者间接获得后者的功能。这是类与类之间合作的一种模式。523.2 类

29、3.2.5 组合和聚集聚集部件可以单独存在组合部件不能单独存在C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 类对象在定义后应该被初始化。以前的做法是调用初始化方法。但这存在缺陷。更好的初始化方法是自动化-构造函数(constructor)类对象在失效后应该清理它占据的资源。以前的做法是调用清理方法。但这也存在缺陷。更好的清理方法仍然是自动化析构函数(destructor)533.3 对象的构造、初始化和析构C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石classlinked_listprivate:node_pt

30、rhead=nullptr;node_ptrtail=nullptr;size_t_size=0;543.3 对象的构造、初始化和析构 初始化Inline模式C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石classT/T是类名public:T(参数列表)语句/这是一个构造函数;实际上,构造函数没有名字!因此不能被显式调用。引起构造函数“调用”的语法称为“函数标记法(functional notation)”,其形式非常类似于函数调用。构造函数没有也不能有返回类型!553.3 对象的构造、初始化和析构 3.3.1 构造函数C+程序设计-现代方法电子科技大学

31、信息与软件工程学院 白忠建第三章 类:面向对象的基石 默认的构造函数:没有参数linked_list:linked_list()linked_listl;/这里,默认构造函数被编译器自动调用 显式声明的构造函数classlinked_listpublic:explicitlinked_list().;563.3 对象的构造、初始化和析构 3.3.1 构造函数默认和显式声明的构造函数C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 构造函数的参数:可以是默认的linked_list:linked_list(size_t len,value_t*a=nullp

32、tr)value_td=;linked_listl(5,d);linked_listk(0);573.3 对象的构造、初始化和析构 3.3.1 构造函数构造函数的参数C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 构造函数的初始化列表:出现在函数头部linked_list(size_tlen,value_t*a):head(nullptr),tail(nullptr),_size(0)构造函数的初始化列表先于其“函数体”执行。类的常量和引用成员只能在初始化列表中被初始化。583.3 对象的构造、初始化和析构 3.3.1 构造函数构造函数的初始化列表C+程

33、序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石classAprivate:inti;public:A(intx):i(x);classBprivate:Aa;public:B(intx):a(x);593.3 对象的构造、初始化和析构 3.3.1 构造函数嵌入对象的初始化C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石linked_list();linked_list(size_t len,value_t*a);linked_list(const std:initializer_list&l);603.3 对象的构造、初始

34、化和析构 3.3.2 构造函数重载初始化列表C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石linked_list():head(nullptr),tail(nullptr),_size(0)linked_list(size_tlen,value_t*a):linked_list()linked_list(std:initializer_list&l):linked_list()613.3 对象的构造、初始化和析构 3.3.2 构造函数重载构造函数委托C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石623.3 对象的构

35、造、初始化和析构3.3.3 统一初始化inta=1;/等价于inta=1intb2;/等价于intb=2int*p=newint41,2,3,4;/数组p的每个元素都被初始化Xn;/n未初始化n=7,8;/赋值classYpublic:intc;doubled;Y(intx,doubley):c(x),d(y)m5,6.0;/callconstructor,m.c=5,m.d=6.0VS常规初始化统一初始化int a=0;/复制初始化const char*p(string);/直接初始化linked_list l(5);/直接初始化,使用了默认参数linked_list k=1,2,3,4;/

36、复制初始化C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石classT/T是类名public:T()语句/这是一个析构函数;析构函数在对象失效时被编译器自动调用。析构函数能被显式调用,但调用后对象将失效。析构函数不能有参数!析构函数没有也不能有返回类型!633.3 对象的构造、初始化和析构 3.3.4 析构函数C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 隐式默认的特殊成员classX;因为没有显式定义,所以类X的构造函数和析构函数都是隐式默认(implicit default)的。隐式默认的成员由编译器合成。显式

37、默认的特殊成员structXX()noexcept=default;/显式默认构造函数必须没有参数X()noexcept=default;643.3 对象的构造、初始化和析构 3.3.5 默认和被删除的成员函数C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石structXX()=delete;X(int)noexcept;Xa;/error,默认构造函数被删除Xb1;/OK653.3 对象的构造、初始化和析构 3.3.5 默认和被删除的成员函数C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石663.5 面向对象方法的应

38、用3.5.1 OOA几个必须回答的问题 我们为什么要开发这样的应用系统?(1)Why 谁会使用这个应用系统?(1)Who 用户会用什么样的方式使用这个系统?(1)How 用户何时会使用这个系统?(1)When 用户在什么场景下会使用这个系统?(1)Where 基于上述问题,我们要开发出什么样的系统?(1)WhatC+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石673.5 面向对象方法的应用3.5.1 OOA案例的用例图C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 面向对象设计的主要过程(但不是全部)包括:系统体系结

39、构设计。类/对象设计。用户界面设计。683.5 面向对象方法的应用3.5.2 面向对象设计C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 目标系统是一个独立的应用系统。因此,系统的体系结构应该是集中式的,即有一个总控模块调度其他功能模块。接下来要进行的是系统的模块分解。根据前面的分析,可以很容易地确定,系统的功能模块由四个部分组成:693.5 面向对象方法的应用3.5.2 面向对象设计体系结构设计总控输入计算输出C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石 一个简单易行的方法就是列出使用场景的流程,然后在流程中找

40、出活动对象。仅保留那些与应用直接相关的对象。标识出这些对象之间的关系。在案例的使用场景中,活动对象有两个:用户和计算器。前者并不需要标识。因此,本系统中活动的对象只有一个,那就是计算器。这里,我们将其标识为:calculator。703.5 面向对象方法的应用3.5.2 面向对象设计标识系统中的类/对象C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石classexpressionpubliclhs:integer;publicrhs:integer;publicoptr:char;publicresult:integer;classcalculatorpr

41、ivateexpr:expression;privateinput():void;privatecalculate():void;privatedisplay():void;publicdoCalc():void;713.5 面向对象方法的应用3.5.2 面向对象设计类的接口设计C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第三章 类:面向对象的基石723.5 面向对象方法的应用3.5.2 面向对象设计其他工作人机界面设计原则用户界面设计添加实现细节代码测试编码实现用户的反馈系统升级和维护交付和运维第四章 类的高级特性C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第

42、四章 类的高级特性744.1 案例-链表类的复制问题 4.1.1 案例及其实现复杂类型的复制操作a:1b:2.3a:?b:?o1o2复制复制的两种方式:X o2o1;o2=o1;a:1b:2.3可以视为是内存复制C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第四章 类的高级特性linked_list:linked_list():head(nullptr),tail(nullptr),_size(0)std:cout in default constructor std:endl;linked_list:linked_list(const std:initializer_list&

43、l):head(nullptr),tail(nullptr),_size(0)for(auto e:l)push_back(e);std:cout in list constructor std:endl;linked_list:linked_list()clear();std:cout in destructor std:endl;754.1 案例-链表类的复制问题 4.1.1 案例及其实现链表的构造函数和析构函数C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第四章 类的高级特性void linked_list:peer()std:cout|head tail _size st

44、d:endl;int main()auto af=(value_t&v)std:cout v ;linked_list l11,2,3,4,5;/定义对象并初始化 std:cout l1:;l1.traverse(af);l1.peer();linked_list l2l1l2l1;/初始化复制 std:cout l2:;l2.traverse(af);l2.peer();return 0;764.1 案例-链表类的复制问题 4.1.1 案例及其实现链表的复制初始化时有两个对象定义,因此应该有两条构造和析构信息in list constructorin list constructorl1:1

45、 2 3 4 5|0 x602000000010 0 x602000000090 5l2:1 2 3 4 5|0 x602000000010 0 x602000000090 5in destructorin destructor=5430=ERROR:AddressSanitizer:attempting double-freedouble-free on 0 x602000000010 in thread T0:#0 0 x7fe3dff1e0f8 in operator delete(void*,unsigned long)././././libsanitizer/asan/asan_ne

46、w_delete.cc:151#1 0 x40100f in linked_list:clear()/此后是详细的诊断信息,故略去C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第四章 类的高级特性void linked_list:peer()std:cout|head tail _size std:endl;int main()auto af=(value_t&v)std:cout v ;linked_list l11,2,3,4,5;/定义对象并初始化 std:cout l1:;l1.traverse(af);l1.peer();linked_list l2l2;l2l2 =l

47、1l1;/赋值 std:cout next);p=p-next)push_backpush_back(p-data);(p-data);C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第四章 类的高级特性884.2 复制控制4.2.3 浅复制和深复制优缺点对比代价较高。需要考虑复制的深度。可能不需要资源共享安全风险较低VS浅复制深复制代价较小可能导致资源共享安全风险较高C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第四章 类的高级特性894.2 复制控制4.2.4 转移对象和转移语义 可能的复制路径classobject;objectf()objectt;return

48、 t;/返回局部对象的值autoa=f();复制复制t资源r匿名临时对象r的副本a资源sr的副本这个过程有问题吗?C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第四章 类的高级特性904.2 复制控制4.2.4 转移对象和转移语义 效率问题复制复制t资源r匿名临时对象r的副本a资源sr的副本这个对象在复制后失效,资源被释放这个资源在复制时释放这个资源是复制而来这正是(早期的)C+被诟病的问题之一。有无好办法解决这类效率问题呢?C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第四章 类的高级特性914.2 复制控制4.2.4 转移对象和转移语义 解决思路复制复制t资源r

49、匿名临时对象r的副本a资源sr的副本直接“转移”给a资源s转移给转义对象去释放这类即将失效(expiring)的对象称为“转移对象”,用右值引用标记C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第四章 类的高级特性924.2 复制控制4.2.4 转移对象和转移语义 编码实现linked_list&operator=(linked_listlinked_list&l&l)std:swap(head,std:swap(head,l.headl.head););std:swap(tail,std:swap(tail,l.taill.tail););std:swap(_size,std:

50、swap(_size,l._sizel._size););return*this;转移复制构造函数转移赋值运算符函数linked_list(linked_listlinked_list&l&l):head(l.head),tail(l.tail),_size(l._size)l.headl.head=l.taill.tail=nullptrnullptr;l._sizel._size=0;=0;C+程序设计-现代方法电子科技大学信息与软件工程学院 白忠建第四章 类的高级特性 私有构造函数,但仅声明,无实现linked_list(constlinked_list&);禁止合成linked_lis

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|