您的位置:首页 > 编程语言 > C语言/C++

C++复习——面向过程的程序设计

2020-06-22 04:22 225 查看

第3章 程序初步设计
3.1 面向过程的程序设计和算法
i. 四种语句:
声明语句、执行语句、空语句、复合语句
ii. 赋值表达式与赋值语句:
赋值语句后面加分号
iii. Cin语句不会读入空格和回车换行符(需要用getchar函数),cin按照定义的变量类型接受输入
iv. C++对一个变量的处理:先明确变量类型,然后对变量进行相应类型赋值
v. Else总是与它上面最近的、且未配对的if配对
vi. 顺序结构 选择结构(if else; switch) 循环结构
vii. for语句构成循环:for(表达式1;表达式2;表达式3)语句

第4章 函数与预处理
4.1 概述
C++作为面向对象的函数,程序执行过程中,由main函数调用其他的类,通过每个类来实现不同功能
4.2 定义函数的一般形式
无参函数和有参函数
4.3 函数参数和函数的值
i. 形式参数和实际参数
定义函数时指定的形参,在未出现函数调用时,它们并不占用内存中的存储单元,只有当函数调用时才占用内存,而且调用结束后,会释放内存。
实参和形参的类型应相同或赋值兼容。(整型与实型转换 字符型和整型相互通用)
实参变量对形参变量的数据传递是“值传递”,即单项传递
ii. 函数返回值
Return后面的值可以是一个表达式,类型以函数类型为准
4.4 函数的调用
函数调用可以有三种函数调用方式:1、函数语句 2、函数表达式 3、函数参数
对于置于主调函数后面的自定义函数,对其调用前需要进行函数声明,便于在程序编译阶段对调用函数的合法性进行全面检查
函数声明也区分作用域,如果放置于主函数外相当于全局声明,之后不需要再进行声明。
4.5 内置函数
调用函数需要一定的时间和空间的开销,内置函数可以在编译时将所调用函数的代码直接嵌入到主函数中,而不是将流程转出去。
只需要在函数首行的左端加一个关键字inline,而且关键字可以选择在声明或者定义时写一个,一般将5个语句以下频繁使用的函数声明为内置函数
4.6 函数的重载
函数重载不能只有函数的类型不同而参数的个数和类型相同,重载函数的参数个数、参数类型、参数顺序3者中必须至少有一种不同。(以免在函数调用时,分不清楚该调用哪个函数)
4.7 函数模板
函数类型和形参类型不具体指定,函数体相同
template <typename T> 或者 template(类似类模板)
只适用于函数的参数个数相同而参数类型不同
4.8 有默认参数的函数
Float area(float r = 6.5)
实参与形参的结合是从左至右顺序进行的,所以指定默认值的参数必须放在形参列表的最右端
带有默认参数的函数声明必须要在声明中给出默认值
重载函数和带默认参数的函数不同共存,不然系统无法判定,出现二义性
4.9 函数的嵌套调用
4.10 函数的递归调用
4.11 局部变量和全局变量
主函数中的变量也只在主函数中有效,符合语句中的变量也只在符合语句中有效({ })
4.12 变量的存储类别
存储期可以分为静态存储器和动态存储器,静态存储器:系统对变量分配固定的存储空间,动态存储方式则是系统对变量动态的分配存储空间

动态存储区(局部变量):1、函数形式参数2、函数的自动变量3、函数调用的现场保护和返回地址
存储类别:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)
自动变量:系统默认是自动变量,在调用时分配内存,在调用结束释放内存
静态局部变量:在静态存储区分配内存,占用的内存单元不会被释放
局部静态变量使用场景:1、为了保留上次函数运行结果 2、变量只被引用而不被改变
寄存器变量:C++允许将局部变量的值放在cpu中的寄存器中
外部变量:用extern对外部变量作提前引用声明,以拓展程序文件中的作用域,拓展外部变量的作用域,可以适用于多文件程序
静态外部变量:变量加上static声明,只能用于本文件的外部变量,只可以被本文件引用。
Note:外部变量采用静态存储方式存储,但是加了static的局部变量也是静态存储,但是加了static的外部变量不是因为加了static而静态存储,加了static是为了限制其作用域,只能被本文件引用。
4.13 变量属性小结
i. 1、存储类别(4种)2、作用域3、存储期
ii. 从作用域划分:局部变量(自动变量、静态局部变量(离开函数,值仍保留)、寄存器变量、形式参数)和全局变量(静态外部变量、外部变量)
iii. 从存储期划分:动态存储(自动变量、寄存器变量、形式参数)和静态存储(静态局部变量、静态外部变量、外部变量)
iv. 从变量存储位置划分:内存中静态存储区、内存中动态存储区和CPU寄存器
4.14 关于变量的声明与定义
定义是需要分配存储空间的,而声明不需要分配内存空间
4.15 内部函数和外部函数
根据能否被其他源文件调用,划分为内部函数和外部函数
内部函数:static 类型标识符 函数名(形参表)只能由本文件使用
外部函数:extern 类型标识符 函数名(形参表)对于外部函数调用,使用时,需要声明
用函数原型可以把函数的作用域扩展到定义该函数的文件之外
头文件里面是函数原型以及其他有关定义
4.16 预处理命令
预处理功能包括以下三种:1、宏定义2、文件包含3、条件编译;这些命令以#开头,而且末尾不包含分号
宏定义:#define 命令将一个指定的标识符来表示一个字符串
#define 标识符 字符串 例如:#define PI 3.1415
#define 宏名(参数表) 字符串 #define S(a,b) a*b
文件包含的作用:一个源文件可以将另外一个源文件的全部内容包含进来,
例如:#include “file2.cpp”
头文件:1、对类型的声明 2、函数声明 3、内置函数的定义 4、宏定义
5、全局变量 6、外部变量声明
文件名可以用尖括号和双撇号括起来,用尖括号时,系统到系统目录中寻找要包含的文件,如果找不到,编译系统就会给出出错信息;双撇号中指出文件路径和文件名。
条件编译:当满足某条件时对一组语句进行编译,当条件不满足时则编译另一组语句。
例如:#ifdef 标识符
程序段1
#else
程序段2
#endif
如果指定的标识符已经被#define命令定义过,则编译程序段1,否则编译程序段2
#if 表达式
程序段1
#else
程序段2
#endif
当指定的表达式为真编译程序段1,否则编译程序段2
第5章 数组
5.1 数组的概念
1) 数组是有序数据的集合
2) 数组名+数组下标唯一确定一个元素
5.2 一位数组的定义和引用
1) 格式:类型标识符 数组名[常量表达式];
2) 数组只能逐个引用
3) 一维数组初始化:可以全部一一赋值也可以部分赋值(相当于调用构造函数)
5.3 二维数组的定义和引用
1) 类型标识符 数组名 [常量表达式][常量表达式]
2) 二维数组初始化:分行赋值,未赋值的默认为0。例如:a[][4]={ {0,0,3 } ,{ } , {0 , 10 } }该数组默认为3行
5.4 用数组名作函数参数
1) 函数实参是数组名,形参也为数组名
2) 数组名代表数组首元素(可能也是一个数组)的地址,用数组名作实参时,不是把实参数组的值传递给形参,而只是把实参数组首元素的地址传递给形参。(相当于传递了指针,可以对数组进行修改)
3) 多维数组的函数引用,例如二维数组的引用需要知道有多少列,int array[][10]
4) 数组名作函数参数时,一定要指定数组的列数(只有知道数组的列数才能知道数组的维数,几行几列)
5.5 字符数组
1) 字符数组中初值个数小于数组长度,则将其余元素自动定为空字符(’\0’)
2) 初值个数和预定的数组长度相同时,在定义时可以省略数组长度。
3) 只能对字符数组的元素赋值,不能整体赋值。(体现了数组的指针思想)
4) 字符串后面是空字符,不代表字符数组最后一个一定是空字符
5) 可以将字符串初始化给字符数组。
6) 输出字符串,遇到第一个空字符就停止输出
7) 字符串处理函数:
i. 字符串连接函数
strcat(char[],const char[]);
将第二个字符数组添加到第一个数组后面去
ii. 字符串复值函数strcpy
strcpy(char[],const char[]);
只能通过调用strcpy函数来实现将一个字符串赋给一个字符数组,而不能用赋值语句将一个字符串常量赋值给一个字符数组
iii. 字符串比较函数
Strcmp(const char[],const char[]);
str1>str2,返回正整数
str1=str2,返回0
str1<str2,返回负整数
iv. strlen(const char[])
测试字符串的实际长度,不包括空字符
8) 字符串变量——string类型

  1. 使用字符串变量,需要加上#include

  2. 可以对字符串变量的某一字符进行操作,如:word[2] = ‘a’

  3. 字符串变量的运算:复制用赋值符号、字符串连接用加号、字符串比较用关系运算符。

  4. string name[5]表示定义了5个字符串元素

  5. 每一个字符串元素只包含字符串本身的字符,不包含空字符

  6. 字符串变量存放的是字符串的地址
    第6章 指针
    6.1 指针的概念
    1. 程序经过编译将变量名转换成变量的地址,对变量值的存取都是通过地址进行的(直接存取方式)
    2. 通过指针变量来进行存器(间接存取)
    6.2 变量与指针
    1. 指针变量是一种特殊的变量
    2. 基类型 *指针变量名
    3. 引用指针变量 1)&取地址符 2)*指针运算符
    4. *&优先级相同,从右向左结合
    5. 指针可以作为函数参数,将一个变量的地址传送给被调用函数的形参
    6. 为什么传递指针可以改变变量的值?因为当形参是一个变量时,实参传递给形参的是变量的值(变量的内容),即:形参不知道变量的地址,无法操作变量。但是当传入的是一个指针(变量的地址),那么形参就可以通过地址来修改变量的值,函数执行结束后虽然传入的地址消失,实参指向的变量却已经改变了。
    7. 实参变量和形参变量之间的数据传递是单向的“值传递”方式,调用函数时不会改变实参指针变量的值,但是可以改变实参指针变量所指向变量的值。
    6.3 数组与指针
    1. int *p = a; 和 int *p = &a[0] 等价
    2. a[0] 和 (a+0) 无条件等价 ;note:a[0]是一个一维数组,所以(a+0)就是取二维数组中的第一个一维数组操作。
    3. 实参数组名a代表一个固定的地址,因此要改变a是不可能的,只能将a赋值给某个指针变量,通过指针变量的加减来访问数组元素。
    4. *(a[0]+1)就是a[0][1]元素的值等价于*(*(a+0)+1)即:*(a[i]+j)等价于*(*(a+i)+j) 和 a[i][j]
    5. 二维数组可以看作是一个数组元素为一位数组的一位数组,而且二维数组物理存储下是连续的,若将二维数组首元素地址赋值给p,通过p++可以访问二维数组所有元素。还可以通过定义指向m个元素组成的一位数组的指针变量来访问二维数组(例如:int (*p)[4] 表示指向由4个元素组成的一位数组)p++可以将地址换行。

  7. *(p+2)+3是数组2行3列的元素地址,*(*(p+2)+3)是a[2][3]的值
    6.4 字符串与指针
    1. char [] 字符数组的指针
    2. string 字符变量的指针
    6.5 函数与指针
    1. 函数类型(*指针变量名)(函数形参表)
    2. 函数指针可以传递给其他函数的形参,就可以进行函数间的调用
    6.6 返回指针值的函数
    1. 一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址。 类型名 *函数名 (参数表列)
    6.7 指针数组和指向指针的指针
    1. 指针数组:一个数组其元素都是指针类型元素 类型名 * 数组名[数组长度] 例如:int *p[4]
    2. 定义指向指针数据的指针变量 数据类型 *(*变量名) 例如 char *(p),由于运算符结合性从右到左,因此可以改写成char **p 可以用来操作指针数组的地址
    6.8 有关指针的数据类型和指针运算的小结

  8. 指针运算小结
    1) 指针变量加/减一个整数:C++规定,一个指针变量加/减一个整数是将改指针变量的原值(一个地址)和它指向变量所占用的内存单元字节数相加/减
    2) 指针变量赋值 取地址符取变量的地址、数组地址、函数地址、指针变量赋值
    3) 指针变量可以为空 (NULL)
    4) 两个指针变量可以相减或者比较 前提是它们指向同一个数组
    5) 对指针变量赋值应注意类型问题
    6.9 引用
    1. 引用的定义:引用是一种新的变量类型,它的作用是为一个变量起一个别名 例如:int a ; int &b = a; b就是a的引用。 &代表引用符号
    2. 理解为是变量b具有变量a的地址,引用需要初始化,而且初始化后不可以改变。
    3. 引用作为函数参数,起到函数传递数据的功能。形参是引用类型,例如:void swap(int &a,int &b) swap(i,j) 就是将a的地址取成i的地址,对a做的修改,会反映到i上面

第7章 自定义数据类型
7.1 结构体类型

  1. 结构体声明:
    struct 结构体类型名
    {
    类型1 变量名1;
    类型2 变量名2;
    ……
    };

  2. 结构体声明并且定义:
    struct 结构体类型名
    {
    类型1 变量名1;
    类型2 变量名2;
    ……
    } student1,student2;

  3. 直接定义结构体类型变量,无结构体类型声明
    struct
    {
    成员表列
    } 变量名表列;

  4. Note:1、类型是不占内存空间的,变量占用内存空间 2、结构体成员还可以是一个结构体 4、结构体中的成员可以和程序中的变量名相同,但是二者没有关系。

  5. 结构体初始化:可以在定义变量时,初始化;也可以类型与定义变量分开的方式

  6. 结构体变量的引用:1、可以将一个结构体变量的值赋值给另一个结构体变量 2、可以引用一个结构体变量中的一个成员的值 3、若成员本身是一个结构体,则需要用若干成员运算符

  7. 不能将一个结构体整体进行输入和输出,只能对结构体变量中的各个成员分别进行输入和输出

  8. 结构体变量的成员和普通变量一样可以进行各种运算

  9. 可以引用结构体变量成员的地址,也可以引用结构体变量的地址,可以将结构体变量的地址传递给形参

  10. 可以通过表列对结构变量中的结构体变量赋值

  11. 结构体数组定义:可以先定义类型,在声明结构体数组;可以同时完成类型和数组定义;还可以不定义类型名,直接定义结构体数组。

  12. 结构体数组初始化:结构体数组名[ ] = {{…},{…},…}

  13. 结构体变量指针可以用来引用结构体变量 若p为结构体变量指针,p->成员变量或者(*p).成员变量 都可以用来引用成员变量

  14. 用结构体变量和指向结构体变量的指针构成链表:结构体中一部分存储需要用的实际数据,另一部分存储下一个结点的地址

  15. 静态链表:在程序中定义,不是临时开辟的,不能用完就释放。动态链表:各结点可以随时插入和删除,这些结点没有变量名,只能通过上一个结点找到下一个结点。

  16. 结构体变量中的数据传递给另一个函数:1、结构体变量名做参数 2、指向结构体变量的指针作实参 3、结构体的变量的引用变量作函数参数。使用第3种的效率最高

  17. 动态分配和撤销内存的运算符new和delete new 类型 (初值)可以用来开辟一个存储空间,并返回一个指向该存储空间的地址,若内存空间分配失败则返回NULL。delete 指针变量 用来释放空间

  18. C语言中使用库函数malloc和free来分配和撤销内存空间
    7.2 共用体

  19. 共用体概念:有时候需要使几种不同类型的变量存放到同一段内存单元中,使几个不同的变量共占同一段内存的结构。声明 :union 共用体类型名 {成员表列};定义: 共用体类型名 共用体变量名;共用体变量所占的内存长度等于最长的成员的长度。

  20. 对共用体的访问方式:不能引用共用体变量,只能引用共用体变量中的成员.例如: a.i

  21. 共用体类型数据的特点:1、虽然希望共用体在同一内存段中存放不同类型的数据,但是在一个时刻只能存放一种类型数据。(分时存放)2、能够访问的共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。3、共用体变量的地址和它的各成员的地址都是同一地址。4、不能对共用体变量名赋值;不能企图引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能将共用体变量名作为函数参数
    7.3 枚举类型

  22. 如果一个变量只有几种可能的值,可以定义为枚举类型。 例如:enum weekday{sun, mon, tue, wed, thu, fri, sat}; enum 枚举类型名 {枚举常量表列}

  23. enum weekday workday,week_end;或者 enum {sun, mon, tue, wed, thu, fri, sat} workday,week_end;

  24. 对枚举元素按常量处理,它们是有值的,C++编译按定义时的顺序对它们赋值为0,1,2,3…。也可以在声明枚举类型时另行指定枚举元素的值。枚举值可以用来做判断比较。一个整数不能直接赋给一个枚举类型。
    7.4 用typedef声明类型

  25. 可以用typedef声明一个新的类型名来代替已有的类型如:typedef int INTEGER typedef float REAL (相当于给类型名起别名)

  26. 声明结构体类型 typedef struct { int month; int day; int year; } DATE; DATE是新类型名,不是结构体变量名。

  27. typedef int NUM[100] 声明NUM为整型数组类型,包含100个元素。 NUM n ,n为包含100个整型元素的数组。 typedef int (*POINTER) () 声明POINTER为指向函数的指针类型

  28. 声明一个新的类型名的方法是:先按定义变量的方法写出定义语句,然后将变量名换成新类型名,前面加一个typedef,就可以用新类型名来定义变量。

  29. 当在不同源文件中用到同一类型数据时,常用tyepdef声明一些数据类型,把它们单独放在一个头文件中,然后在需要它们的文件中用#include命令把它们包含进来,以提高编程效率。使用typedef有利于程序的通用和移植。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: