c++程序设计-现代方法课件.pptx
- 【下载声明】
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+程序设计-现代方法电子科技大学信息与软
展开阅读全文