C程序设计基础教程.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C程序设计基础教程.ppt》由会员分享,可在线阅读,更多相关《C程序设计基础教程.ppt(346页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第二期更新内容C+11/14C+11/14标准标准Lambda、static_assert,type traits,Move semantics。WIN32 WIN32 消息,绘图,控件,资源,文件,内存,进程,线程。消息,绘图,控件,资源,文件,内存,进程,线程。起源语言特点语言缺点C+语言及相关软件介绍day01前景与方向编译器安装与配置由C+起源:1974年Bjarne博士在分析与研究UNIX系统由与内核分布面造成的网络流量时试图寻找一种有效工具使其更加模块化他在c的增加了类似Simula的类的机制并与1983年开发一种新的语言C+;C+的语言特点1兼容c且继承了c的特性并同c一样高效且
2、可移植2属于面向对象的编程抽象封装继承多态3语言灵活(类的层次结构设计)且支持指针3支持运算符重载4异常处理机制5支持泛型编程Tf(Tx)returnx*x;6多种类库的支持语言缺点:语言复杂支持多种设计风格复杂的c+程序正确性不易保证C+的发展方向windows平台unix平台嵌入式C+也是一种编译型的语言推荐使用vs2013编译环境其他可选vc6.0vs2010nodepad+vs2013基本支持c11标准vs2010以上Vs2013是微软公司的一款软件开发平台IDE(集成开发环境)Vs2013的安装使用1安装前需要先安装IE10提供支持2下载安装包http:/ inline 一种新的嵌套
3、名字空间的使用方式嵌套在名字空间的内联名字空间在使用时不需其名字空间进行限定使用Inline namespace inspace 布尔类型string类型结构体数据类型day04联合枚举1新的数据类型:布尔类型:bool表示布尔量的数据类型取值:由字面值常量true(非零)真false(0NULLfalse0)构成trueboolisok=true;boolnotok=false;2字面值truefalse可以通过提升转换为int类型true1false0inta=true;/a=1;3任何基本类型都可以被隐式转换为布尔类型转换后非0为真0为假二String类型(类)(自动处理大小)使用需要添
4、加头文件stringC语言中是用字符数组来存放字符串chara110=“abc”a22=a,0;1初始化:stringstr1;stringstr2=“abc”;2String可以做赋值拼接等功能结构体:在c+中结构体内允许定义函数且结构体在计算大小时为1而C中为0在定义结构体时可以省略关键字struct联合:定义时可以省略联合名为匿名联合()访问时可以不用加联合的前缀X.枚举:枚举类型在c+中为一个独立的类型不能把一个整数赋值给一个枚举变量C+11:1 类型的占位符 auto 根据初始化的内容推断变量类型 作用简化代码 2 nullptr std:nullptr_t类型的值,用来指代空指针
5、nullptr和任何指针类型以及类成员指针类型的空值之间可以发生 隐式类型转换,同样也可以隐式转换为bool型.强类型枚举强类型枚举C+11中通过引入了一个称为强类型枚举的新类型,修正了这种情况。强类型枚举由关键字enum class标识。它不会将枚举常量暴露到外层作用域中,也不会隐式转换为整形,并且拥有用户指定的特定类型(传统枚举也增加了这个性质)函数重载(函数多态)重载机制哑元函数函数重载一day051概念:同一作用域的一组参数列表不同,函数名相同的函数这组函数叫函数重载(C+允许定义相同名称的函数)作用:重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污
6、染,对于程序的可读性有很大的好处(一物多用)参数列表不同:1参数类型不同2参数顺序不同3参数个数不同重载版本根据参数的匹配度进行选择注意:1.1与函数参数的变量名无关1.2函数的返回值类型与重载无关2函数重载的实现原理是通过c+换名实现的extern“C”intfun()的形式可以以c的方式生成函数名(无换名机制)3使用场景:当函数基本上执行相同的任务使用不同形式的数据时哑元函数缺省参数内联函数函数重载二day06哑元函数:参数只有类型没有形参名的函数voidfun(int);功能:1保持向前兼容性2做函数的区分Toperator+()Toperator+(int)缺省参数如果函数的形参有缺省
7、值,当函数调用时没有传递实参,那么形参就使用缺省值,如果调用函数时传递了实参,那么形参就使用实参的值注意:1缺省参数靠右原则如果一个函数有多个参数且部分参数有缺省值那么缺省值的参数必须靠右(在编译期间确定参数)2如果函数的声明和定义分开那么缺省参数只能写在函数的声明部分3注意防止重载的冲突(歧义)4c+中函数的规则不接受任何参数(否则可能构成重载)5 凼数参数的缺省值叧能在凼数声明丨指定 3内联:函数使用关键字inline关键字修饰的函数叫做内联函数函数调用过程:调用用后立即存储该指令的内存地址将函数参数复制到堆栈跳到标记函数起点的内存单元执行函数代码(可能还有返回值放入到寄存器中)将返回值弹
8、出然后跳回到地址被保存的指令处内联的实质:就是把函数编译好的二进制代码替换成函数的调用指令(省去了调用开销)(空间换取时间)注意:1类中直接定义的函数自动被处理成内联函数,所以一般把内联函数放在头文件中2inline是一种请求,实现方式取决于编译器,特别是当函数较大或是递归的时候1引用的概念2如何创建一个引用3引用的本质指针与引用day074引用的应用5引用与指针1引用:引用是已定义变量的别名,为c+新增的一种复合类型2创建一个引用:intvar_i;int&int&revar_i=var_i;注意:1这里的&不是取址符而是类型标识符的一部分2创建引用时必需初始化3引用的内容不能为空null4
9、引用创建之后就不能更换引用的内容int&ra=a;ra=b;这样定义之后我们就可以用var_i或rvar_i来操作变量var_i;3引用的本质:引用的内部是由指针完成实现的int*double*其本身并非一个实体类型(可由sizeof证明)int&double&4引用的应用:4.1做函数的参数省去函数参数进行复制时的内存开销常引用型的参数可以防止实参被无意修改且可以接受常量型与非常量型参数foo(constint&i)I=0foo(a)4.2做函数的返回值做返回值时需保证返回值的有效性注意:不能返回局部变量的引用也可以返回常引用型的返回值补充:左值与非左值(右值)一般的左值参数是可以被引用的数
10、据对象如:变量数组元素结构成员引用和解除引用的指针都是左值非左值包括字面常量(引号括起的字符串除外,它们由其地址表示)和包含多项的表达式intI;I=10;10=I;strings1=s2+s3+s4;(a+)临时变量temp(a+1),右值intc=(a+b)右值;“abc”=“abc”(+a)=1;左值int&I=10;右值引用5指针与引用5.1指针是一个实体存放地址而引用仅是一个内存的别名5.2引用必须初始化且初始化后不可更换其引用的目标指针可以不初始化且其指针的指向的内容可随时更换(常指针除外)5.3引用不可以为空指针可以为空/char*pc=0;char&rc=*pc;.5.4引用的
11、大小为所引用变量的大小指针为4个字节5.5因引用是一个内存的别名所以不存在引用引用的引用和引用数组但存在指向指针的指针和指针数组5.6在使用时,如果你的变量的指向可能发生变化或为空,请使用指针,如果你的变量不允许为空,可以引用5.7 不存在空引用的事实意味着引用的代码比指针的代码效率要高 (无需检查其他合法性)5.8 重载某些运算符时,必须用到引用做返回值C语言的类型转换C+的类型转换Static_cast类型转换day08Const_castReinterpret_castC+提供丰富的不同的数据类型当不同类型在进行算术运算参数传递等一系列的操作时因计算机的特性不得不将不同的类型进行转换后再
12、进行操作1初始化和赋值进行的转换(int)dint(d)=右边的类型将会转换成左边的数值类型(赋值后的数值不安全)2以方式初始化时进行的转换(不允许缩窄浮点转换整型)(c+11)3表达式中的转换类型提升4传递参数时的转换5强制类型转换5.1(typename)value:标ctypename(value):c+5.2static_cast(源类型变量)a-b隐式类型转换的逆转换转换时做静态检查(在编译时进行)检查(诸如指针越界计算,类型检查)Char-intIntchar5.3const_cast(源类型变量)去除指针或引用上的const属性voidfoo(constint*i)5.4rein
13、terpret_cast(源类型变量)任意类型的指针或引用或整型之间的转换但不可改变const属性其他限制是不能转换成比指针更小的类型不能将函数指针与其他类型进行转换5.5dynamic_cast(源类型变量)多态父子类指针或引用之间的转换动态转换New的使用方法Delete使用方法Lambda表达式动态内存分配/lambda表达式day09C+在添加动态分配运算符newdelete的同时,支持标准C的动态分配库函数语法:1type_name*pointer_name=newtype_name;/未初始化说明:与malloc不同new会根据类型的不同自动分配对应的内存大小且返回对应类型的指针2
14、type_name*pointer_name=newtype_name(value)/初始化3type_name*pointer_name=newtype_name()/初始化为零4type_name*pointer_name=newtype_namen分配n个type_name的数据的内存大小4type_name*pointer_name=newtype_namen=1,2,3,4.c+0 x标准初始化数组时进行初始化5deletepointer_name与非new配对使用6deletepointer_name与new配对使用某些编译器在分配数组的大小时会在所分配的内存前多加4个字节大小用于
15、存放分配的数组大小7对new分配内存是否失败的判断new操作符会抛出bad_alloc异常C+之父给C程序员的建议1.1尽量的少使用宏使用inline函数替代带参的宏使用constenum去替代常量宏1.2使用namespace去避免命名冲突1.3变量随时用随时定义以保证初始化1.4尽量少使用强制类型转换如果必须转换就使用四个转换运算符中的一个1.5少使用mallocfree因为newdelete会做的更好1.6尽量少使用C风格的字符串因为string会使用更方便1.7逐步建立面向对象的思想Lambda 表达式”(lambda expression)是一个匿名函数,即没有函数名的函数。Capt
16、ure 子句子句Lambda 可在其主体中引入新的变量(用 C+14),它还可以访问(或“捕获”)周边范围内的变量。1.var表示值传递方式捕捉变量var;2.=表示值传递方式捕捉所有父作用域的变量(包括this);3.&var表示引用传递捕捉变量var;4.&表示引用传递方式捕捉所有父作用域的变量(包括this);5.this表示值传递方式捕捉当前的this指针。空 capture 子句 指示 lambda 表达式的主体不访问封闭范围中的变量。可以使用默认捕获模式(标准语法中的 capture-default)来指示如何捕获 lambda 中引用的任何外部变量(使用 capture-defa
17、ult 时,只有 lambda 中提及的变量才会被捕获)注意事项:引用捕获可用于修改外部变量,而值捕获却不能实现此操作。(mutable允许修改副本,而不能修改原始项。)引用捕获会反映外部变量的更新,而值捕获却不会反映。引用捕获引入生存期依赖项,而值捕获却没有生存期依赖项。当 lambda 以异步方式运行时,这一点尤其重要。如果在异步 lambda 中通过引用捕获本地变量,该本地变量将很可能在 lambda 运行时消失,从而导致运行时访问冲突。参数列表参数列表在 C+14 中,如果参数类型是泛型,则可以使用 auto 关键字作为类型说明符。这将告知编译器将函数调用运算符创建为模板。参数列表中的
18、每个 auto 实例等效于一个不同的类型参数。可变规范可变规范通常,lambda 的函数调用运算符为 const-by-value,但对 mutable 关键字的使用可将其取消。它不会生成可变的数据成员。利用可变规范,lambda 表达式的主体可以修改通过值捕获的变量返回类型返回类型将自动推导 lambda 表达式的返回类型。无需使用 auto 关键字,除非指定尾随返回类型。trailing-return-type 类似于普通方法或函数的返回类型部分。但是,返回类型必须跟在参数列表的后面,你必须在返回类型前面包含 trailing-return-type 关键字-。如果 lambda 体仅包含
19、一个返回语句或其表达式不返回值,则可以省略 lambda 表达式的返回类型部分。如果 lambda 体包含单个返回语句,编译器将从返回表达式的类型推导返回类型。否则,编译器会将返回类型推导为 voidLambda 体体从封闭范围捕获变量,如前所述。参数 本地声明变量 类数据成员(在类内部声明并且捕获 this 时)具有静态存储持续时间的任何变量(例如,全局变量)面向对象抽象类与对象类与对象day10C+是一种面向对象的编程语言面向对象(oop)是一种特殊的设计程序的概念性方法C+的一些语言特性使得应用这种方法更容易OPP特性:抽象封装继承多态代码重用1抽象:现实空间逻辑抽象计算机学生学生类ST
20、UDENT学生:属性:stringname;stringmajor;doublescore;行为:voidstudy();voidexam();voidplay();2类:具有相同的属性和行为的对象被分成一组即为一个类类在c+中为一种自定义复合类型:成员变量成员函数(方法)3对象:类是对现实世界的抽象对象则是类在程序中的一个虚拟的实例可以用类来声明变量(也称为实例)。每个实例是类的一个对象4使用类来描述一个类struct/classSTUDENT访问控制限定符:/struct无stringname;intstuID;doublescore;voidstudy();voidexam();void
21、play();5实例化:定义类的实例可以称为类的实例化STUDENTstudent;6struct定义类成员默认为公开class定义类成员默认为私有7成员控制限定符public:公有成员任意访问protected:保护成员只有本类成员和子类可以访问private:私有成员只有本类成员可以访问对不同成员的访问控制属性加以区分体现了c+作为面向对象程序设计语言的封装特性8类的声明与实现可以分开(分开后则不能形成内联)如何初始化对象创建过程对象的创建过程day11如何初始化成员对象?(因为私有成员的存在)C+为类的初始化提供了一个特有的函数-构造函数构造函数的作用:对对象的成员的初始化构造函数的特性
22、:1构造函数与类型名相同2当创建一个对象时会被自动调用(仅调用一次)3构造函数没有返回值类型4.1如果不提供构造函数编译器则自动提供一个无参构造函数4.2但提供构造函数编译器会自动回收默认的构造函数4.3缺省构造构造对基本类型不做初始化类类型调用相应的缺省5构造函数可以进行重载6构造函数的参数可以是默认值,但默认值必需靠右编写一般可以通过构造函数参数的默认值简化构造函数的个数对象的创建过程1为整个对象分配内存空间2以构造实参调用构造函数2.1构造基类部分(无基类忽略)2.2构造成员变量(如果是类类型则构建这个成员)2.3执行构造代码(函数只放在代码区)3在栈中创建单个对象类名对象;/注意不加空
23、括号Aa;类名对象(实参表)4在栈中创建对象数组类名对象数组元素个数类名对象数组元素个数=类名(实参表),;类名对象数组=类名(实参表),;A*arr10=newA10A(1),A(2);实现一个时钟类初始化列表类型转换构造拷贝构造初始化列表,析构,单参构造函数day121构造函数的初始化列表A(inti):.i(i).,.m_i=i;与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段2为什么使用初始化列表初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作/2.1常量成员,因为常量只能初
24、始化不能赋值,所以必须放在初始化列表里面2.2引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面2.3成员变量的初始化顺序:按照成员定义的顺序进行初始化(与初始化表的顺序无关)2.4类的类型成员变量和基类子对象必须在初始化列表中初始化,否则将调用相应类型的缺省构造函数进行初始化(数组成员不能在列表中初始化)3类型转换构造函数(单参构造函数)构造函数当其参数只有单个时它还有另一种功能:类型转换3.1在目标类型中,可以接受单个源类型对象实参的构造函数,支持从源类型到目标类型的隐式类型转换classAA(inti,intj=0,)Aa=100;3.2通过explici
25、t关键字,可以强制这种通过构造函数实现的类型转换必须显式地进行4析构函数4.1析构函数形式:类名()4.2特点:无返回值,无参数,且不能重载4.3何时被调用:在销毁对象时,会自动调用,且仅被调用一次(也可手调用)4.4应用:一般用于对对象在构造过程或生命周期内所申请的资源内存也可以执行其他类设计者所需要的最后使用对象之后的操作(如没有动态分配内存,非必需定义析构函数)4.5缺省析构函数5.1如果类中没有定义析构函数,编译器会提供一个缺省析构函数5.2缺省析构函数的特性:5.2.1对基本类型的成员变量不做任何操作5.2.2对类类型的成员变量和基类子对象,会调用相关的类型的析构函数6对象的销毁过程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 基础教程
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内