书签 分享 收藏 举报 版权申诉 / 291
上传文档赚钱

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

  • 上传人(卖家):三亚风情
  • 文档编号:3514724
  • 上传时间:2022-09-10
  • 格式:PPTX
  • 页数:291
  • 大小:4.48MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《c++程序设计-现代方法课件.pptx》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    c+ 程序设计 现代 方法 课件
    资源描述:

    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

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:c++程序设计-现代方法课件.pptx
    链接地址:https://www.163wenku.com/p-3514724.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


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

    163文库