版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式系统C+语言,陈俊彦,主要内容,一、嵌入式系统开发语言 二、C+语言的简单回顾,一、嵌入式系统开发语言,汇编语言 C语言 C+语言 JAVA语言 其它(如nes C等,汇编语言,汇编语言的优点 程序运行结果直观 便于对程序的跟踪和调试 程序执行效率很高 程序运行速度很快 汇编语言的缺点 开发效率低下 使用场合 系统初始化、系统任务切换、时序严格的场合,C语言,C语言是在嵌入式领域中应用最广泛的编程语言,几乎所有的嵌入式开发环境都支持C语言。 C语言是一种高效的语言,用C写的程序执行速度快,占用内存少,经过优化后效率接近汇编程序。 C语言的主要不足是缺乏编程模型,描述复杂逻辑十分困难。同时
2、,程序员可以随意修改程序中的内容,这在提高编程灵活性的同时也带来安全隐患,C+语言,C+保留了C语言的强大功能与灵活性,并提供了继承、封装、多态等面向对象技术,为程序设计带来了深及灵魂的变革。 但是,C+语言过于庞大,对于资源受限的嵌入式系统来说,执行效率难于保证。 在1998年,Embedded C+规范正式制度(简称为EC+)。EC+是标准C+的一个子集,它从C+语法中剔除了一些实现复杂和会导致额外负担的语法元素。例如:友元、虚基类、异常处理、模板、命名空间等。同时,在标准库方面,EC+规范也做了删减,剔除了STL和Stream等。 C+在嵌入式系统中主要应用在图形界面开发,JAVA语言,
3、Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。 Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景,二、C+语言的简单回顾,面向对象程序设计方法概述 类和对象 构造函数和析构函数 继承与派生,面向对象程序设计方法概述,面向过程的程序设计方
4、法 详细地描述每一瞬时的数据结构及对其的操作过程。 面向对象的程序设计方法 将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,类和对象,客观世界中任何一个事物都可以看成一个对象(Object) 任何一个对象都具有两个要素:属性和行为 对象的类型称为类,类代表了某一批对象的共性和特征 类是对象的抽象,对象是类的具体实例,声明类类型,类类型声明形式: class 类名 private: 私有的数据和成员函数; public: 公用的数据和成员函数; protected: 受保护的数据和成员函数;,声明类类型举例,例子: class Timer public: vo
5、id CalculateTime(); /成员函数 void ShowTime(); private: int hour; / 数据成员 int min; int sec;,类成员访问属性,私有成员(private):只能被本类中的成员函数引用,类外不能调用(友元类例外)。 公用成员(public):既可以被本类中的成员函数所引用,也可以被类的作用域内的其他函数引用。 受保护成员(protected):不能被类外访问,但可以被派生类的成员函数访问。 如果不做属性声明,系统将其成员默认为私有成员(private,定义对象,先声明类类型,然后再定义对象 类名 对象名 例如:Timer time1;
6、 在声明类类型的同时定义对象 不出现类名,直接定义对象 例如:class private : public : time1, time2,对象的动态建立,前面介绍的方法定义的对象是静态的,在程序运行过程中,对象所占的空间不能随时释放,只有在函数结束时,该对象才释放。 用new运算符动态建立对象,可随时撤销对象,释放内存空间。 用new运算符动态地分配内存后,将返回一个指向新对象的指针的值,即所分配的内存空间的起始地址。用户可以获得该地址,并通过该地址来访问这个对象。如: Timer *time = new Timer; 在不再需要使用由new建立的对象时,可以用delete运算符予以释放,类外
7、定义成员函数,类的成员函数在类体中只写成员函数的声明,而在类的外面进行函数的定义。成员函数在类外定义时,必须在函数名前面加上类名,予以限定。 “:”是作用域限定符,或称作用域运算符,用它声明函数是属于哪个类的。如Timer:CalculateTime(); 如果在作用域限定符的前面没有类名,或者函数名前面既无类名又无作用域限定符,则表示该函数不属于任何类,这个函数不是成员函数,而是全局函数,即非成员函数的一般普通函数。如 :close() 或 close(,成员函数的存储方式,类定义的每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,不包括函数代码所占用的存储空间,如下图,对象成员
8、的引用,通过对象名和成员运算符访问对象中的成员 例如:time1.CalculateTime(); 通过指向对象的指针访问对象中的成员 例如:Timer *p = 上例定义了time1对象的引用变量time2,它们共占同一段存储单元,this指针,在每一个成员函数中都包含一个特殊的指针this,它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。 this指针是隐式使用的,它是作为参数被传递给成员函数。 可以用*this表示被调用的成员函数所在的对象,*this即当前的对象。如: return(*this).hour,数据成员初始化,类的数据成员是不能在声明类时初始化的,
9、因为类不是一个实体,而是一种抽象类型,并不占存储空间 如果一个类中所有的成员都是公用的,可以在定义对象时对数据成员进行初始化。例如: class Time public: hour; minute; sec; Time t1 = 14, 13, 45 ; 如果数据成员是私有的或者受保护的成员,只能使用构造函数初始化,构造函数,构造函数是一种特殊的成员函数,与其它成员函数不同,不需要用户调用它,而是在建立对象时自动执行。构造函数的名字必须与类名同名,不能由用户任意命名。它不具有任何类型,不返回任何值。构造函数的功能由用户定义,用户根据初始化的要求设计函数体和函数参数。例如: class Time
10、 public: Time() hour = 0; minute = 0; sec = 0; private: hour; minute; sec;,带参数的构造函数,构造函数名(类型1 参数1,类型2 参数2,) class Time public: Time( int, int, int ); private: hour; minute; sec; Time:Time( int h, int m, int s ) hour = h; minute = m; sec = s; Time t1( 14, 13, 45,构造函数的重载,在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化
11、的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相同。这称为构造函数的重载 class Time public: Time( ) hour = 0; minute = 0; sec = 0; Time( int h, int m, int s ) hour = h; minute = m; sec = s; private: hour; minute; sec; Time time1; Time time1( 14,12,45,构造函数的使用,构造函数在类对象进入其作用域时调用 构造函数没有返回值,因此也不需要在定义构造函数时声明类型。不能写成void Time()
12、构造函数不需用户调用,也不能被用户调用 在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句。但一般不提倡在构造函数中加入与初始化无关的内容 如果用户自己没有定义构造函数,则C+系统会自动生成一个空的构造函数,但不执行初始化操作,析构函数,析构函数也是一个特殊的成员函数,它的作用与构造函数相反 命名:类名( ) 当对象的生命期结束时,会自动执行析构函数 析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作 析构函数不返回任何值,没有函数类型,也没有函数参数,不能被重载 一个类可以有多个构造函数,但只能有一个析构函数,执行析构函数的情况,如果在一个函数中定义了
13、一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数 Static局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数 如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数),调用该全局对象的析构函数 如果用new运算符动态地建立一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数,调用构造函数和析构函数的顺序,先构造的后析构,后构造的先析构,先进后出,类的封装性和信息隐蔽,类的作用是把数据和算法封装在用
14、户声明的抽象数据类型中。在面向对象的程序设计中,在声明类时,一般都是把所有的数据指定为私有的,使它们与外界隔离,把需要让外界调用的成员函数指定为公用的,外界通过公用的函数来实现对数据操作。外界与对象唯一的联系渠道就是调用公用的成员函数。这样就使类与外界的联系减少到最低限度,继承和派生,所谓“继承”就是在一个已存在的类的基础上建立一个新的类,新类从已有的类那里获得其已有特性。已存在的类称为“基类”或者“父类”。 从另一个角度来说,从已有的类(父类)产生的一个新的子类,称为类的派生。新建立的类称为“派生类”或者“子类”。派生类继承了基类的所有数据成员和成员函数,并可以对成员作必要的增加或调整 派生
15、类是基类的具体化,基类是派生类的抽象,派生类的声明方式,class 派生类名:继承方式 基类名 派生类新增加的成员 ; 继承方式包括public(公用的),private(私有的),protected(受保护的),默认为private 例如:class Timer1:public Timer private: int msec; /新增毫秒 int usec; /新增微秒 public: void CalculatemsTime(); /新增成员函数,派生类成员的访问属性,不同的继承方式决定了基类成员在派生类中的访问属性: 公用继承:基类的公用成员和保护成员在派生类中保持原有的访问属性,其私有
16、成员仍为基类私有。 私有继承:基类的公用成员和保护成员在派生类中成了私有成员。其私有成员仍为基类私有。 受保护的继承:基类的公用成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有,派生类的构造函数,一般形式为 派生类构造函数名(总参数表列) : 基类构造函数名(参数表列) 派生类中新增数据成员初始化语句 例如:Timer1( int h, int m, int s, int ms, int us ) : Timer( int h, int m, int s ) msec = ms; usec = us; Timer1 time1( 12, 14, 25, 32, 22 ); 执行顺序
17、:先调用基类的构造函数,再调用派生类的构造函数,有子对象的派生类的构造函数,如果在一个类声明中包含其它已声明类的对象,该对象称为子对象。 定义有子对象的派生类的构造函数一般形式为: 派生类构造函数名(总参数列表): 基类构造函数名(参数列表), 子对象名(参数列表) 派生类中新增数据成员初始化语句 执行顺序:先调用基类的构造函数,再调用子对象的构造函数,最后调用派生类的构造函数,多重继承,一个派生类只从一个基类派生,称为单继承,这种继承关系所形成的层次是一个树形结构,如图1: 一个派生类有两个或多个基类的,称为多重继承。这种继承关系所形成的结构图如图2,图1,图2,声明多重继承,如果已声明了类
18、A、类B、类C,可以声明多重继承的派生类D: class D : public A, private B, protected C 类D新增加的成员 D按不同的继承方式的规则继承A、B、C的属性,确定各基类的成员在派生类中的访问权限,多重继承派生类的构造函数,一般形式为: 派生类构造函数名(总参数列表) : 基类1构造函数名(参数列表), 基类2构造函数名(参数列表), 基类3构造函数名(参数列表) 派生类中新增数据成员初始化语句 执行顺序:先调用基类的构造函数,再调用派生类的构造函数。调用基类的顺序按照声明派生类时基类出现的顺序,多重继承引起的二义性问题,多重继承容易因为继承的成员同名而产生二义性问题,使程序的编写和维护出错。 二义性问题通常有以下3种情况: (1)多个基类有同名成员 解决办法:用基类名来限定成员。例如: class C : public A, public B C c1; /定义对象c1 c1.A:display( ); /调用c1中基类A的成员函数 c1.B:display( ); /调用c1中基类B的成员函数,多重继承引起的二义性问题,2)基类和派生类有同名成员,则基类的同名成员在派生类仲被屏蔽。需要注意的是,不同的成员函数只有在函数名和参数个数相同、类型相匹配的情况下才会发生同名覆
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 47288-2026无线电数据系统接收机产品和特性测量方法
- 护理员说课:护理员的工作职业创新
- 护理个案:护理感染控制
- 化妆品对皮肤的影响
- 金太阳陕西省2026届高三下学期3月联考数学(26-287C)+答案
- 零售业总裁助理面试技巧与常见问题
- 学校护学岗制度
- 领导日程安排与提醒服务
- 轮机长职业发展规划
- 成都空港精密仪器装备产业园南侧配套提升工程水土保持方案报告表
- (新教材)2026年春期人教版三年级下册数学教学计划+教学进度表
- 商品盘点操作流程连锁店
- JCT412.1-2018 纤维水泥平板 第1部分:无石棉纤维水泥平板
- 司马光《与王介甫书》原文注释赏析译文
- 书记员考试公共基础知识试题(附解析)
- 不说脏话从我做起主题班会PPT模板
- 2023版思想道德与法治专题4 继承优良传统 弘扬中国精神 第2讲 做新时代的忠诚爱国者
- 林义《社会保险基金管理》(第2版)笔记和课后习题详解
- 2023年安徽汽车职业技术学院单招职业适应性测试题库及答案解析
- YY/T 0698.2-2022最终灭菌医疗器械包装材料第2部分:灭菌包裹材料要求和试验方法
- 二次函数中几何图形的最值问题课件
评论
0/150
提交评论