嵌入式基础之----C++
一:构造与析构
为什么需要构造函数:因为类是一个集合的东西,里面包含了很多的数据。当定义了一个类的具体对象时,初始化就显得是必须的了。如果是全局的对象,那么其数据会被初始化为零,但往往不会去定义全局的对象。所以就迫切的需要一个成员函数专门进行初始化的工作,这就是构造函数,它以人们预期的方式对对象进行初始化。
如果一个类中没有显示的定义构造函数,那么系统会提供一个默认的构造函数,它没有参数,什么事情也不做。一旦显示的定义了构造函数(无论是否是默认构造函数),那么编译器都不会在给你提供默认构造函数。
声明构造函数的方法是: 类名(参数列表);
定义构造函数的方法是:类名::类名(参数列表){ 初始化实现 }
构造函数的分类:默认构造函数(没有参数,注意在使用时不能加小括号),一般构造函数,拷贝构造函数,转换构造函数(只有一个标准类型的参数)。
引申:直接调用类名调用构造函数
作用是实实在在产生一个类的对象,但该对象没有名字,一般不能使用,除非用于下列三种情况,1是作为函数返回值,返回一个类的对象,2是用于赋值。3是用于转换构造函数。
为什么需要析构函数:在删除一个对象之前做一些清理工作,另外可以传递信息,让程序员了解最后一次使用该对象后的一些状况。
声明析构函数的方法是: ~类名(参数列表);
定义析构函数的方法是:~类名::类名(参数列表){ 初始化实现 }
二: 静态,常,友元
静态数据成员:一般的类中的数据成员是放在一起的,同一个类的不同对象都有自己独立的这些数据。而成员函数是公用的,同一个类只有一套。调用时都会转到成员函数的入口,并通过传递this指针来进行区分。然而,有的时候需要同一种类的不同对象之间能够有些联系,可以用于对象间的通信,那么模仿函数内部的静态局部变量,可以很容易实现这一点。只要在定义类时,在数据成员的前面加关键字 static ,则把该数据定义成了类的静态数据成员,它被存储在数据段,并且所有同类但不同对象都共用这一个静态数据。倘若这是用sizeof来测试类的大小,那么它是不会包括静态数据成员的。
另外始终要明白一点静态数据成员是属于类的,而不是属于某一个对象的。它的初始化必须在程序的全局区,初始化的形式为: 类名::静态变量名 = 值 ;
静态数据成员的访问,既可以用普通成员函数也可以用下面介绍的静态成员函数来进行。但是既然已经有了静态成员函数这一概念,那么就应该提倡以静态成员函数来访问静态数据成员。静态成员函数也是属于类的,调用方法为 类名::静态成员函数名。当然也可以使用 对象名.静态成员函数名 的方法。另外注意很重要的一点,因为静态成员函数时属于类的,在调用该函数时是不会传递this指针的,也就是说,静态成员函数是断不可访问非静态数据成员的。
常对象
为什么需要常对象?声明了一个类,那么通过类可以创建很多对象,这些对象可能会被该变内部数据的值,这很正常。但总有的时候需要一个对象,其里面的数据时不能被改变的。这既是常对象。但是调用常对象的成员函数时,很可能会更改数据成员,所以C++只允许常成员函数来访问常对象的数据成员。否则编译出错。常成员函数的声明和定义都必须在后面加 const 关键字。
如果不得不在常成员函数中修改数据成员,那么在定义该类时可以使用关键mutable.
另外如果在类中的数据成员前加const关键字,就变成了常数据成员,其初始化只能通过初始化表进行。
友元函数
作用:允许本类的成员函数以外的函数访问所有的数据成员。
三 :操作符重载
操作符重载的概念:对于重载的概念,从函数重载已经有所领悟,其实就是编译器对于相同名字的东西,它能够根据某些性质的不同而确定的调用不同的实现方式。C++本身或者说是C语言本身,对于操作符已经具有了重载的特性。例如对于整形数据的加法和对浮点型数据的加法都使用的是操作符“+”,然而其具体的实现是不相同的。从广义上讲,C++中的类可以看做是一种新的数据类型,而且C++始终是围绕类和对象来编程的。但是显而易见的是C++编译器不可能对类的操作符操作具有事先约定,因为类的多元化使这种想法不可能实现,那么只能寄希望与C++提供一种机制,可以让用户自己来定义对相同的类或者不同的类之间进行操作符操作,这种机制就是操作符重载机制。但是要清楚一点,操作符重载的重点不在于重载,而在于操作符的实现。
操作符重载的实现方法,主要就是定义一个函数,这个函数具有和普通函数相同的地方,也有其特殊的地方,而最关键的是,把它定义成什么属性的函数。是类似与C语言的最一般的函数,还是将其定义为类的成员函数,抑或是友元函数。应该说,这三种方式都是可以的,因为操作符重载函数本质上就是函数。然而由于它的特殊性,这三种属性的定义方式各有优缺点。如果定义成最一般的函数,那么它是不能直接访问类的私有数据成员的,它必须依靠类的对外接口来进行对类的私有数据的读取,这样显然是低效的,所以这种方法不提倡使用。如果类的成员函数,那么它的定义和具体调用在形式上是不同的。
它的定义是这样的: 返回类型 类名::operate @(形参列表) 其中@ 用来指代具体的那一种操作符。而且如果是类的成员函数,那么形参列表是不包含第一个操作数的!因为它是类的成员函数,在调用时是会隐式传递this参数的,就相当于是把第一个操作数的信息传递给了该函数。在调用该函数时(假设是双目操作符),那么 C1 @ C2就是调用该函数的形式。他就相当于是 C1.operate @(C2)。所以对于这种定义和实际使用的形式不一致性要做到心中有数。
如果是一般函数,并且把它作为类的友元函数,那么的形参列表就很容易理解,必须要两个操作数的形参了。定义语法和成员函数是相同的:
返回类型 类名::operate @(形参列表)。如果是双目运算符,那么它的具体调用形式为:C1 @ C2 ,它就相当与 operate @(C1 , C2)。
了解了双目运算符重载的方法,那么运算符重载就相当于是掌握了一大半。单目操作符的重载对于类的成员函数来说一般是不需要参数的,因为它成员函数在调用时会自动传递this参数,而如果是友元函数,那么它是需要参数的。另外对于像 ++ 和 ++ 这样的单目操作符,它是具有两种形式的,可以放在变量前面的,也可以是放在变量后面的,那么对于这种不同,C++是有约定的。如果是成员函数,参数为空,那么是前置定义,如果形参列表有一个整形,那么是后置的。对于单目操作符个人觉得用成员函数来定义,更加妥当。
除此之外还有一种强制类型转换操函数。可以把它看做强制转换操作符的重载。它不需要返回值。其形式(成员函数)为:
operator 类型名()
{实现语句}
有几点需要明白。强制类型转换适用于把一个类对象转换为一个确定的数据类型。并且在使用时不需要显示的说明。例如类型名为 double 。那么 在程序中,如果有这样的语句:
Double x,y;
Student c; //Student为一个类名
且在Student类中定义了该类的强制转换函数,那么语句:
x = y + c ; 是合法的。当编译器遇到 操作符 “+” 时发现两边的数据类型不相同,且有没有该形式的操作符重载,但是有Student的强制转换函数,就会把c强制转换为double型。
四: 继承与派生
虚基类
五: 虚函数与多态
赋值兼容规则
嵌入式基础之----C++相关推荐
- 应邀ITGeGe在线教育社区嵌入式基础开发讲师
最近,被一家IT在线公司邀请去做嵌入式基础课程的讲师,我感觉非常荣幸,虽然我还是菜鸟一个,难得有这样的企业会看得起我,这也是对我的一个磨练吧,可以培养我继续不断学习技术的动力,同时还能将技术通过自身的 ...
- 嵌入式基础(1)---硬件知识,搞嵌入式开发必备
嵌入式基础硬件知识,搞嵌入式开发必备 做嵌入式系统开发,经常要接触硬件.做嵌入式开发对数字电路和模拟电路要有一定的了解. 这样才能深入的研究下去.下面我们简单的介绍嵌入式开发中的一些硬件相关的概念. ...
- 嵌入式系统概念以及嵌入式基础知识
嵌入式系统概念以及嵌入式基础知识 \\\插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的(禾厶-亻言-手戈).最近比较闲,带做毕设,带学生参加省级以上比赛/ ...
- matlab中三相断路器如何连接,Matlab在电力电子技术仿真中的应用 - 嵌入式基础教程...
Matlab在电力电子技术仿真中的应用 - 嵌入式基础教程 (2017-06-07 11:51:26) 1. 引言 20世纪60年代发展起来的电力电子技术,使电能可以变换和控制,产生了现代各种高效.节 ...
- STM32嵌入式基础开发附C-STM32-CAN通讯
目录 1 博客内容 2 STM32芯片.TJA1050.上位机 3 CAN环回模式.轮询/中断接收模式 4 程序原理 5 主程序(Main.c) 6 CAN程序(CAN.c) 7 CAN头文件(CAN ...
- ChinaSoft 论坛巡礼 | 嵌入式基础软件论坛
2022年CCF中国软件大会(CCF ChinaSoft 2022)将于2022年11月25-27日在线上举行.预期将有林惠民.陈左宁.邬江兴.何积丰.梅宏.吕建.柴洪峰.廖湘科.王怀民.郑纬民.蒋昌 ...
- 看技术笔记,提高嵌入式基础
今天给大家推荐一个嵌入式方向公众号[嵌入式大杂烩],该公众号专注于嵌入式技术,主要分享C语言. 嵌入式.物联网.Linux等方面的技术笔记,力求通俗易懂. [嵌入式大杂烩]号主ZhengN,是一位新能 ...
- 嵌入式基础(2)---硬件基础知识
嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分.国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可 裁剪,适应应用系统对功能.可靠性.成本.体积.功耗等严格要求的专用 ...
- Linux嵌入式基础知识
一个嵌入式Linux系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序:包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分. 2.Linux内核:特定 ...
- 《嵌入式基础》实验三 ARM编程模型和ARM指令
零.前言 本人不擅长写汇编相关的东西,所以以下内容也是不断摸索(百度 ) 整出来的,和linux的实验报告的质量相比较低. 一. 实验目的 掌握ARM微处理器的汇编指令的使用方法. 掌握使用 LDM/ ...
最新文章
- 新的MOVE结构,和在项目中实际的感受
- 2.2 理解 Mini-batch 梯度下降-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
- 简单的串口助手程序开发
- NetPayClient for PHP使用说明
- winxp精简版没有IIS的解决办法
- 就业技术书文件表格_就业申请书
- 集合的划分(信息学奥赛一本通-T1315)
- 有源蜂鸣器的驱动设计
- python画猴子_Python学习笔记(1)
- Java从零开始学三十六(JAVA IO- 字符流)
- Spring Boot中的事务管理与手把手实战
- 记一次守护日志导致硬盘空间告警问题
- 解决DOS窗口中文乱码问题
- 归一化相关系数相关匹配公式
- 记一次机房断电办公室网络瘫痪的恢复经过
- kaggle房价预测
- 机械祭天法力无边:C++primer之书店程序包含Sales_item.h源码
- CAD图层亮度的设置
- 《牛客解题》Fibonacci数列
- 网易web安全工程师进阶网易web安全微专业从基础到进阶