跟我一起学C++.doc
《跟我一起学C++.doc》由会员分享,可在线阅读,更多相关《跟我一起学C++.doc(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、跟我一起学C+1 C+介绍1.1 为什么要学习C+编程语言的需求总结为四个:效率(efficiency),灵活(flexibility),抽象(abstraction),生产力(productivity)。C语言注重前两者,C+注重前三者,JAVA、这些注重后两者。1.2 C+为什么难学 1.3 C+ 11值得学习的新特性1.4 几本推荐的书籍1.5 开发工具选择2 从C到C+(一)2.1 bool类型逻辑型也称布尔型,其取值为true(逻辑真)与false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+中为1个字节。2.2 const限定符const 只读用const给字面常量起个
2、名字(标识符),这个标识符就称为标识符常量;因为标识符常量的声明与使用形式很像变量,所以也称常变量定义的一般形式:const 数据类型 常量名=常量值;数据类型 const 常量名=常量值; 注意事项:常变量在定义时必须初始化;常变量初始化之后,不允许再被赋值;2.3 const与#defineconst定义的常量与#define定义的符号常量的区别const定义的常量有类型,而#define定义的没有类型,编译可以对前者进行类型安全检查,而后者仅仅只是做简单替换const定义的常量在编译时分配内存,而#define定义的常量是在预编译时进行替换,不分配内存。作用域不同,const定义的常变量
3、的作用域为该变量的作用域范围。而#define定义的常量作用域为它的定义点到程序结束,当然也可以在某个地方用#undef取消定义常量还可以用enum,尽量用const、enum替换#define定义常量。2.4 结构体内存对齐什么是内存对齐编译器为每个“数据单元”按排在某个合适的位置上。C、C+语言非常灵活,它允许你干涉“内存对齐”为什么要对齐性能原因:在对齐的地址上访问数据快。如何对齐第一个数据成员放在offset为0的位置其它成员对齐至min(sizeof(member),#pragma pack所指定的值)的整数倍。整个结构体也要对齐,结构体总大小对齐至各个成员中最大对齐数的整数倍。 3
4、 从C到C+(二)3.1 域运算符C+中增加的作用域标识符 :用于对与局部变量同名的全局变量进行访问用于表示类的成员,这将在关于类的一节中详细说明3.2 new、delete运算符new运算符可以用于创建堆空间成功返回首地址 语法:指针变量=new 数据类型;指针变量=new 数据类型长度n;delete运算符 可以用于释放堆空间语法:delete 指针变量;delete 指针变量;3.3 重载相同的作用域,如果两个函数名称相同,而参数不同,我们把它们称为重载overload函数重载又称为函数的多态性函数重载不同形式:形参数量不同形参类型不同形参的顺序不同形参数量与形参类型都不同调用重载函数时
5、,编译器通过检查实际参数的个数、类型与顺序来确定相应的被调用函数3.4 name managling与extern Cname managling这里把它翻译为名字改编。C+为了支持重载,需要进行name managling extern “C”实现C与C+混合编程#ifdef _cpluscplus extern “C”#endif #ifdef _cpluscplus #endif 3.5 带默认参数的函数函数声明或者定义的时候,可以给形参赋一些默认值调用函数时,若没有给出实参,则按指定的默认值进行工作函数没有声明时,在函数定义中指定形参的默认值函数既有定义又有声明时,声明时指定后,定义后
6、就不能再指定默认值默认值的定义必须遵守从右到左的顺序,如果某个形参没有默认值,则它左边的参数就不能有默认值。void func1(int a, double b=4.5, int c=3); /合法 void func1(int a=1, double b, int c=3); /不合法函数调用时,实参与形参按从左到右的顺序进行匹配3.6 带默认形参值的函数的二义性重载的函数中如果形参带有默认值时,可能产生二义性4 从C到C+(三)4.1 引用引用是给一个变量起别名定义引用的一般格式:类型 &引用名 变量名;例如:int a=1;int &b=a; / b是a的别名,因此a与b是同一个单元注意
7、:定义引用时一定要初始化,指明该引用变量是谁的别名在实际应用中,引用一般用作参数传递与返回值4.2 const引用const引用是指向const对象的引用4.3 引用传递引用传递方式是在函数定义时在形参前面加上引用运算符&例如:swap(int &a,int &b);注意:引用作参数时,函数的实参与形参在内存中共用存储单元,因此形参的变化会使实参同时变化。 4.4 引用作为函数返回值引用的另一个作用是用于返回引用的函数函数返回引用的一个主要目的是可以将函数放在赋值运算符的左边。注意:不能返回对局部变量的引用。4.5 引用与指针区别引用访问一个变量是直接访问,而指针是间接访问。引用是一个变量的别
8、名,本身不单独分配自己的内存空间,而指针有自己的内存空间。引用一经初始化不能再引用其它变量,而指针可以。5 从C到C+(四)5.1 内联函数当程序执行函数调用时,如果使用频率却很高,程序频繁调用该函数所花费的时间却很多。为了提高效率。为了协调好效率与可读性之间的矛盾,C+提供了另一种方法,即定义内联函数,方法是在定义函数时用修饰词inline。例:(在函数前,加inline)inline int max(int a, int b)return a b ? a : b;相当于#define MAX(a, b) (a) (b) ? (a) : (b)5.2 内联函数与带参数宏区别内联函数调用时,要
9、求实参与形参的类型一致,另外内联函数会先对实参表达式进行求值,然后传递给形参;而宏调用时只用实参简单地替换形参。内联函数是在编译的时候、在调用的地方将代码展开的,而宏则是在预处理时进行替换的在C+中建议采用inline函数来替换带参数的宏。5.3 新的类型转换运算符旧式转型(T)expr T(expr)新式转型const_cast(expr)static_cast(expr) reinterpret_cast(expr) dynamic_cast(expr)5.4 static_cast(expr)编译器隐式执行的任何类型转换都可以由static_cast完成当一个较大的算术类型赋值给较小的类
10、型时,可以用static_cast进行强制转换。可以将void*指针转换为某一类型的指针可以将基类指针指向派生类指针无法将const转化为nonconst,这个只有const_cast才可以办得到5.5 const_cast(expr)用来移除对象的常量性(cast away the constness)const_cast一般用于指针或者引用使用const_cast去除const限定的目的不是为了修改它的内容使用const_cast去除const限定,通常是为了函数能够接受这个实际参数5.6 reinterpret_cast(expr)reinterpret_cast “通常为操作数的位模式
11、提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。 int i;char *p = This is a example.;i = reinterpret_cast(p);/此时结果,i与p的值是完全相同的。 int *ip char *pc = reinterpret_cast(ip);/ 程序员需要记得pc所指向的真实对象是int型,并非字符串。/ 如果将pc当作字符指针进行操作,可能会造成运行时错误/ 如int len = strlen(pc);5.7 dynamic_cast(expr)执行“安全向下”转型操作,也就是说支持运行时识别指针或所指向的对象,这是唯一个无法用旧式
12、语来进行的转型操作。6 面向对象介绍(一)6.1 程序机器语言与汇编语言机器语言就是一些机器能读懂的二进制指令集合汇编语言将机器指令映射为一些可以被人读懂的助记符,如ADD、SUB等。高级语言高级语言屏蔽了机器的细节,提高了语言的抽象层次,程序中可以采用具有一定含义的数据命名与容易理解的执行语句。这使得在书写程序时可以联系到程序所描述的具体事物。6.2 结构化程序设计面向过程“程序=算法+数据结构”特点是数据与程序分离,即数据与数据处理分离。结构化程序设计基本思想是采用自顶向下、逐步细化的设计方法与单入单出的控制结构。其理念是将大型程序分解成小型、便于管理的任务。如果其中的一项任务仍然过大,则
13、将它分解为更小的任务。这一过程将一直持续下去,直到将程序划分为小型的,易于编写的模块。结构化程序设计缺陷:程序难以管理数据修改存在问题程序可重用性差用户要求难以在系统分析阶段准确定义,致使系统在交付使用时产生许多问题。用系统开发每个阶段的成果来进行控制,不能适应事物变化的要求。面向过程程序设计缺点的根源在于数据与数据处理分离6.3 面向对象程序设计面向将系统看成通过交互作用来完成特定功能的对象的集合。每个对象用自己的方法来管理数据。也就是说只有对象内部的代码能够操作对象内部的数据。7 面向对象介绍(二)7.1 面向对象程序设计面向对象(Object Oriented )是认识事务的一种方法,是
14、一种以对象为中心的思维方式面向对象的程序设计:对象=(算法+数据结构)程序=对象+对象+对象面向对象程序设计模拟自然界认识与处理事物的方法,将数据与对数据的操作方法放在一起,形成一个相对独立的整体对象(object),同类对象还可抽象出共性,形成类(class )。一个类中的数据通常只能通过本类提供的方法进行处理,这些方法成为该类与外部的接口。对象之间通过消息(message)进行通讯。7.2 数据抽象结构化设计方法应用的是过程抽象。所谓过程抽象是将问题域中具有明确功能定义的操作抽取出来,并将其作为一个实体看待。数据抽象是较过程抽象更高级别的抽象方式,将描述客体的属性与行为绑定在一起,实现统一
15、的抽象,从而达到对现实世界客体的真正模拟。7.3 实体、对象、类之间的关系现实世界中的实体可以抽象出类别的概念。对应于计算机世界就有一个类(class)的概念,因为类是一个抽象的概念的对应体,所以计算机不给它分配内存,只给对象分配内存。左图表达了计算机世界与现实世界之间的对应关系。7.4 从机算机的观点看对象对象是计算机内存中的一块区域。通过内存分块每个对象在功能上相对保持独立。这些内存不但存储数据,也存储代码。这保证对象是受保护的,只有对象中的代码能访问存储于对象中的数据。这清楚地限定了对象所具有的功能,并且使得对象不受未知外部事件的影响,从而使自己的数据与功能不会因此遭受破坏。对象之间只能
16、通过函数调用也就是发送消息来实现相互通信。当对象的一个函数被调用时,对象执行内部的代码来响应该调用,从而使对象呈现一定的行为。这个行为及其呈现出来的结果就是该对象所具有的功能。7.5 面向对象的基本特征抽象封装继承多态7.6 抽象抽象是从具体到一般的过程抽象是人们认识事物的一种方法抓住事物本质,而不是内部具体细节或具体实现7.7 封装封装是指按照信息屏蔽的原则,把对象的属性与操作结合在一起,构成一个独立的对象。通过限制对属性与操作的访问权限,可以将属性“隐藏”在对象内部,对外提供一定的接口,在对象之外只能通过接口对对象进行操作。封装性增加了对象的独立性,从而保证了数据的可靠性。外部对象不能直接
17、操作对象的属性,只能使用对象提供的服务。7.8 继承继承表达了对象的一般与特殊的关系。特殊类的对象具有一般类的全部属性与服务。 当定义了一个类后,又需定义一个新类,这个新类与原来的类相比,只是增加或修改了部分属性与操作,这时可以用原来的类派生出新类,新类中只需描述自己所特有的属性与操作。继承性大大简化了对问题的描述,大大提高了程序的可重用性,从而提高了程序设计、修改、扩充的效率。继承通俗讲就是拿来主义。7.9 多态多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述多态性是允许你将父对
18、象设置成为与一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal与C+中都是通过虚函数(Virtual Function) 实现的。详见百度百科多态。多态性:同一个消息被不同对象接收时,产生不同结果,即实现同一接口,不同方法。一般类中定义的属性与服务,在特殊类中不改变其名字,但通过各自不同的实现后,可以具有不同的数据类型或具有不同的行为。当向图形对象发送消息进行绘图服务请求后,图形对象会自动判断自己的所属类然
19、后执行相应的绘图服务。 多态使得我们能够以一致的观点来看待不同但大相径庭的对象。7.10 继承与多态继承与多态性组合,可以生成很多相似但又独一无二的对象。继承性使得这些对象可以共享许多相似特性,而多态又使同一个操作对不同对象产生不同表现形式。这样不仅提高了程序设计的灵活性,而且减轻了分别设计的负担。7.11 面向对象编程方法的特性程序设计的重点在数据而不是函数程序由对象组成,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。 对象之间通过相互协作来完成功能函数与相关的数据紧密结合数据可以被隐藏很容易扩充新的数据与函数7.12 面向对象编程的优缺点面向对象编程
20、的优点:易维护:可读性高,即使改变需求,由于继承的存在,维护也只是在局部模块,维护起来是非常方便与较低成本的。质量高:可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。效率高:在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。这样的方法解决问题,接近于日常生活与自然的思考方式,势必提高软件开发的效率与质量。易扩展:由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。 面向对象编程的缺点:运行效率会下降8 类与对象(一)8.1 类声明/类是一种用户自定义类型,声明形式:class 类名称 publ
21、ic: 公有成员(外部接口) private: 私有成员 protected: 保护成员8.2 公有、私有、保护成员在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据与函数。 在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。在关键字protected后面声明,与private类似,其差别表现在继承与派生时对派生类的影响不同 /02.h#ifndef _02_H_#define _02_H_class Clockpublic:/成员函数,行为void Display();void Init(int hour,int min
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一起 C+
限制150内