C++程序设计整理(Part Ⅰ)

C++程序设计整理

1. C语言 VS C++

  • C语言功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好,既具有高级语言的优点,又具有低级语言的许多特点,特别适合写系统软件。它是结构化和模块化的语言,是基于过程的。
  • C++的提出:为了解决软件设计的危机
  • C++保留了C语言原有的所有优点,增加了面向对象的机制。它是C语言的超集,既可用于基于过程的结构化程序设计,又可用于面向对象的程序设计。
  • C++对C的"增强",表现在两个方面:①在原来基于过程的机制基础上,对C语言的功能做了扩充 ②增加了面向对象的机制

2. 一个程序从编写到获得运行结果需要经历的几个步骤

①用C++语言编写程序 ②对源程序进行编译 ③将目标文件连接运行程序 ⑤分析运行结果

3. 符号常量 VS 常变量

  • 符号常量用 #define指令定义;常变量用const定义
  • 符号常量没有类型,不存在以符号常量命名的存储单元;常变量具有变量的特征,不仅有类型,在内存中还存在着以它命名的存储单元,与一般变量不同的是,常变量的值不能改变。

4. C++的程序结构

  • 一个程序包含一个或多个程序单位,每一个程序单位由以下3个部分组成:
    预处理指令:如#include指令和#define指令
    全局声明:在函数外对数据类型、函数以及变量的声明和定义
    函数:包括首部和函数体,在函数体中可以包含声明语句和执行语句

5. 形式参数和实际参数

  • 形式参数:在定义函数时函数名后面括号中的变量名称
  • 实际参数:在主调函数中调用一个函数时,函数名后面括号中的参数
  • 在定义函数时指定的形参,在未出现函数调用时,它们并不占内存中的存储单元,因此称它们是形式参数或虚拟参数,表示它们并不是实际存在的数据,只有在发生函数调用时,函数中的形参才被分配内存单元,以便接收从实参传来的数据。在调用结束后,形参所占的内存单元也被释放。

6. 函数的分类

  • 从用户使用的角度看,函数有两种:①系统函数,即库函数 ②用户自己定义的函数
  • 从函数的形式看,函数分两类:①无参函数 ②有参函数
  • 按函数在语句中的作用来分,可以有以下3种函数调用方式:①函数语句 ②函数表达式 ③函数参数

7. 函数声明和函数原型

  • 函数声明:在函数尚未定义的情况下,事先将该函数的有关信息通知编译系统,以便使编译能正常进行
  • 函数原型:是一种可以不写形参名,而只写形参类型的函数声明
  • 函数原型的作用:根据函数原型在程序编译阶段对调用函数的合法性进行全面检查

8. 函数的定义 VS 函数的声明

  • 定义是指对函数功能的确立,包括指定函数名,函数类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位
  • 声明的作用则是把函数的名字、函数类型以及形参的个数、类型和顺序(注意,不包括函数体)通知编译系统,以便在对包含函数调用的语句进行编译时,据此对其进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)
  • 函数的声明是函数的原型,而函数的定义是函数功能的确立

9. 变量的定义 VS 变量的声明

  • 声明部分出现的变量有两种情况:
    ①需要建立存储空间的,称定义性声明,或简称为定义
    ②不需要建立存储空间的,称引用性声明
  • 广义地说,声明包括定义,但并非所有的声明都是定义
    如:int a;它是定义性声明,可以说是声明,也可以说是定义;extern int a;它是声明而不是定义
    把建立存储空间的声明称为定义,把不需要建立存储空间的声明称为声明

10. 内置函数

  • 内置函数的提出:解决调用函数时的时间和空间的开销。因为调用函数前要"保护现场",调用函数后要"恢复现场",如果函数需要频繁使用,则会用很长时间,从而降低程序的执行效率。
  • 内置函数:又称内嵌函数或内联函数,指在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去。指定内置函数只须在函数首行的左端加一个关键字inline即可
  • 优点 VS 缺点:使用内置函数可以节省运行时间,但增加了目标程序的长度
  • 适用场景:规模较小而又被频繁调用的简单函数(不包含循环语句和switch语句的函数或不包含递归函数)

11. 函数的重载

  • 概念的提出:解决功能相同而名字不同的函数需要分别编写不同程序的情况
  • 函数的重载(function overload):即对一个函数名重新赋予它新的含义,使一个函数名可以多用。所谓重载,其实就是"一物多用"
  • 重载函数的参数个数、参数类型和参数顺序三者中必须至少有一种不同,以便于编译系统可以判别应该调用哪一个函数。函数返回值类型可以相同也可以不相同。

12. 函数模板

  • 概念的提出:在函数重载的基础上,进一步解决函数体是相同的,只是形参的类型不同,也要分别定义的情况。
  • 函数模板(function template):实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。
  • 定义函数模板的一般形式为:
template <typename T>
通用函数定义

或

template <class T>
通用函数定义
  • 适用场景:函数体相同、函数的参数个数相同而类型不同的情况,如果参数的个数不同,则不能用函数模板。

13. 有默认参数的函数

  • 概念的提出:解决使用相同的实参多次调用同一函数的情况,这种方法比较灵活,可以简化编程,提高运行效率
  • 如果有多个形参,可以使每个形参有一个默认值,也可以只对一部分形参指定默认值,另一部分形参不指定默认值。实参和形参的结合使从左至右顺序进行的,因此指定默认值的参数必须放在形参表列的最右端,否则出错。
  • 在使用带有默认参数的函数时有两点要注意:
    (1)如果函数的定义在函数调用之前,则应在函数定义中给出默认值。如果函数的定义在函数调用之后,则在函数调用之前需要有函数声明,此时必须在函数声明中给出默认值,在函数定义时可以不给出默认值。也就是说必须在函数调用之前将默认值的信息通知编译系统。由于编译是从上到下逐行进行的,如果在函数调用之前未得到默认值信息,在编译到函数调用时,就会认为实参个数与形参个数不匹配而报错。
    如果在声明函数时已对形参给出了默认值,而在定义函数时又对形参给出默认值,有的编译系统会给出"重复指定默认值"的报错信息,有的编译系统对此不报错,甚至允许在声明时和定义时给出的默认值不同,此时编译系统以先遇到的为准。由于函数声明在函数定义之前,因此以声明时给出的默认值为准,而忽略定义函数时给出的默认值。
    (2)一个函数不能既作为重载函数,又作为有默认参数的函数。因为当调用函数时如果少写一个参数,系统无法判定是利用重载函数还是利用默认参数的函数,会出现二义性,系统无法执行。

14. 局部变量和全局变量

  • 局部变量:在函数内部或复合语句中定义的变量,形式参数也是局部变量
  • 全局变量:在函数外定义的变量
  • 全局变量的作用:增加了函数间数据联系的渠道
  • 全局变量的缺陷:①在程序的全部执行过程中都要占用存储单元 ②降低了函数的通用性 ③降低了程序的清晰性,难以判断出每个瞬时各个全局变量的值
  • 局部变量:
    ①自动变量,即动态局部变量【离开函数,值就消失】:函数的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属于此类。自动变量用关键字auto作存储类别的声明。
    在调用该函数时,系统给形参和函数中定义的变量分配存储空间,数据存储在动态存储区中。在函数调用结束时就自动释放这些空间。
    如果是在复合语句中定义的变量,则在变量定义时分配存储空间,在复合语句结束时自动释放空间。
    ②用static声明静态局部变量【离开函数,值仍保留】:局部变量的值在函数调用结束后不消失而保留原值,即占用的存储单元不释放,在下一次调用时,该变量保留上一次函数调用结束时的值
    静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。
    ③用register声明寄存器变量【离开函数,值就消失】:为提高执行效率,C++允许将局部变量的值放在CPU中的寄存器(寄存器可以认为是一种超高速的存储器),需要用时直接从寄存器取出参加运算,不必再到内存中去存取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高执行效率。
    ④形式参数【可以定义为自动变量或寄存器变量】

全局变量:
①用static声明静态外部变量【只限本文件引用】:希望某些外部变量只限于被本文件引用,而不能被其他文件引用,这是可以在定义外部变量时加一个static声明
②外部变量【即非静态的外部变量,运行其他文件使用】
用extern声明外部变量
(1)在一个文件内声明全局变量:用extern对外部变量作提前引用声明,以扩展程序文件中的作用域
(2)在多个程序文件中声明外部变量:在任一文件中定义外部变量,而在另一文件中用extern作外部变量声明

  • 两种形式的外部变量都用静态存储方式,只是作用范围不同,都是在编译时分配内存的

15. 作用域和存储期

  • 作用域:如果一个变量在某个文件或函数范围内是有效的,则称该文件或范围为该变量的作用域,在此作用域内可以引用该变量,所以又称变量在此作用域内“可见”,这种性质又称为变量的可见性
  • 存储期:如果一个变量值在某时刻是存在的,则认为这一时刻属于该变量的"生存期",或称该变量在此时刻"存在"
    如:静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是"不可见"的。

16. 头文件

  • 头文件包含的几类内容:
    (1)对类型的声明
    (2)函数声明
    (3)内置函数的定义
    (4)宏定义
    (5)全局变量定义
    (6)外部变量定义
    (7)其他头文件
  • 由于有了#include指令,就可以把不同的文件组合在一起,形成一个文件。因此说,头文件是源文件之间的接口。

17. 变量作函数参数 VS 数组名作函数实参

  • 在用变量作函数参数时,只能将实参变量的值传给形参变量,在调用函数过程中如果改变了形参的值,对实参没有任何影响,因为实参和形参之间的传递是单项的,即实参的值不因形参的值改变而改变。【发生函数调用时,形参被分配内存单元】
  • 数组名作函数实参时,如果改变了形参数组元素的值将同时改变实参数组元素的值,因为此时是将实参数组首元素的地址传递给形参,实参数组和形参数组共占用一段内存单元【既然形参数组就是实参数组,函数调用时不会分配内存空间】

18. 字符数组 VS 字符串

  • 字符数组:char c[]={'C','h','i','n','a'}; (长度为5)
  • 字符串:char c[]="China";char c[]={'C','h','i','n','a','\0'};等价 (长度为6)
    ①字符数组不一定是字符串,字符串一定是字符数组
    ②字符数组使用循环逐个输出字符,字符串可以作为一个整体直接输出
    ③字符数组中的数组长度等于字符个数,而字符串会在末尾加’\0’作为结束标志,因此数组长度始终大于字符串实际长度

19. 字符串类型与字符串变量

  • 字符串类型(string类型),在使用方法上,它和char,int类型一样,可以用来定义变量(必须先定义后使用),这就是字符串变量——用一个名字代表一个字符序列
  • 在使用string类的定义变量时,必须在本文件的开头将C++标准库中的string头文件包含进来,即应加上#include<string>,这一点是与基本数据类型变量所不同的
  • 字符串连接函数strcat
  • 字符串复制函数strcpy
  • 字符串比较函数strcmp
  • 字符串长度函数strlen
    对于字符串变量:字符串复制直接用赋值号;字符串连接用加号;字符串比较直接用关系运算符

20. 字符串数组(借助了C++的类的功能来实现)

  • 不仅可以用string定义字符串变量,也可以用string定义字符串数组
  • 在字符数组的每一个元素中存放一个字符串,而不是一个字符,这是字符串数组与字符数组的区别。如果用字符数组存放字符串,一个元素只能存放一个字符,要用一个一维字符数组才能存放一个字符串
  • 字符串数组中的每一个元素的值只包含字符串本身的字符而不包括’\0’

21. 指针数组和指向指针的指针

  • 指针数组:如果一个数组,其元素均为指针类型数据,该数组称为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量,它的值都是地址。
  • 指向指针数据的指针,简称为指向指针的指针

22. const指针和void指针

  • 指向常量的指针变量:不允许通过指针变量改变它指向的对象值,但指针变量的指向是可以改变的
    定义这种指针变量的一般形式为:const 类型名 * 指针变量名;
  • 常指针:指针变量的指向不能改变,但指针变量的指向变量的值可以改变
    定义这种指针变量的一般形式为:类型名 * const 指针变量名;
  • 指向常量的常指针:把以上两种作用叠加在一起,就是指向常量的常指针变量。即指针变量指向一个固定的对象,该对象的值不能改变(指不能通过指针变量改变该对象的值)
    定义这种指针变量的一般形式为:const 基本类型名 * const 指针变量名;
  • void指针:"指向空类型"或"不指向确定的类型"的数据

23. 引用

  • 对一个数据可以建立一个"引用",它的作用是为一个变量起一个别名。引用其实就是一个指针常量,它的指向不能改变,只能指向一个指定的变量。
  • C++之所以增加引用的机制,是为了方便用户,用户可以不必具体去处理地址,而把引用作为变量的"别名"来理解和使用,而把地址的细节隐藏起来,这样难度会小一点。
  • 将变量名作为实参和形参。这时传给形参的是变量的值,传递是单向的。如果在执行函数期间形参的值发生变化,并不传回给实参。因为在调用函数时,形参和实参不是同一个存储单元。
  • 传递变量的地址。形参是指针变量,实参是一个变量的地址,调用函数时,形参(指针变量)得到实参变量的地址,因此指向实参变量单元。(传值方式)
  • 以引用作为形参,在虚实结合时建立变量的引用,使形参名作为实参的"引用",即形参成为实参的引用。(地址传递方式)

24. 动态分配和撤销存储空间

  • C语言中是利用库函数malloc和free来分配和撤销内存空间的
  • C++是利用运算符new和delete来分配和撤销内存空间的
    注意:new和delete是运算符,不是函数,因此执行效率高
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值