LK 博客
c++计算机二级知识点总结
项目
约 1 分钟阅读 0 赞 0 条评论 鸿蒙黑体

c++计算机二级知识点总结

Jokerbai
Jokerbai @Jokerbai
累计点赞 0 登录后每个账号只能点一次
内容长度 0 正文词元数
正文
目录会跟随阅读位置移动。
阅读进度

全国计算机等级考试二级 C++ 语言程序设计

这份文档按“定义—结论—规律—易错点—题型应用—代码模板”整理,你直接拿去背、拿去刷题、拿去套上机题,直接拉满。

目录

  • 第一部分 公共基础知识
      1. 计算机系统基础
      1. 数据结构与算法
      1. 程序设计基础
      1. 软件工程基础
      1. 数据库设计基础
  • 第二部分 C++语言知识
      1. C++语言概述
      1. 数据类型
      1. 表达式与运算符
      1. 基本控制结构
      1. 数组、指针与引用
      1. 函数
      1. 类和对象
      1. 继承和派生
      1. 多态、虚函数与抽象类
      1. 运算符重载
      1. 模板
      1. C++流与文件
  • 第三部分 上机操作题总库
  • 第四部分 高频判断题结论库
  • 第五部分 高频模板库
  • 第六部分 高频易错点总库

第一部分 公共基础知识

第1章 计算机系统基础

1.1 计算机系统的组成

一个完整的计算机系统由两大部分组成:

(1)硬件系统

  • 输入设备
  • 输出设备
  • 运算器
  • 控制器
  • 存储器

(2)软件系统

  • 系统软件
  • 应用软件

1.2 硬件与软件的区别

硬件

  • 看得见、摸得着
  • 有物理磨损
  • 会老化

软件

  • 逻辑实体
  • 具有抽象性
  • 没有明显制造过程
  • 不会像硬件一样磨损和老化

1.3 软件分类

系统软件

  • 操作系统
  • 编译程序
  • 解释程序
  • 数据库管理系统(DBMS)
  • 服务程序

应用软件

  • 办公软件
  • 财务软件
  • 教务系统
  • 学生信息管理系统
  • 图像处理软件

1.4 程序、指令、软件的关系

  • 指令:计算机能直接执行的基本命令
  • 程序:按一定顺序组织起来的一组指令
  • 软件:程序 + 数据 + 文档

1.5 数据库管理系统

  • DBMS 属于系统软件
  • 负责数据库中数据的定义、组织、存储、维护、控制和服务
  • 运行在操作系统支持之下

第2章 数据结构与算法

2.1 基本概念

  • 数据:能输入计算机并被处理的符号集合
  • 数据元素:数据的基本单位,也叫结点
  • 数据对象:性质相同的数据元素集合
  • 数据结构:相互之间存在一种或多种特定关系的数据元素集合

2.2 逻辑结构

线性结构

满足:

  1. 有且仅有一个开始结点
  2. 每个结点最多只有一个前驱、一个后继

典型:

  • 线性表
  • 队列

非线性结构

典型:

  • 二叉树
  • 二叉链表表示的二叉树

高频判断

  • 单链表:线性结构
  • 双向链表:线性结构
  • 循环链表:线性结构
  • 栈:线性结构
  • 队列:线性结构
  • 循环队列:线性结构
  • 二叉链表:非线性结构

2.3 存储结构

顺序存储结构

  • 逻辑上相邻,物理上也相邻
  • 随机访问快
  • 插入删除通常要移动元素

链式存储结构

  • 逻辑上相邻,物理上不一定相邻
  • 通过指针建立联系
  • 结点 = 数据域 + 指针域
  • 插入删除方便
  • 一般更占空间

高频判断

  1. 顺序存储不等于线性结构
  2. 链式存储也可用于非线性结构
  3. 链式存储一般比顺序存储更占空间
  4. 链表中插入删除通常只改指针,不移动数据

2.4 栈

定义

只允许在表的一端进行插入和删除操作的线性表。

特点

  • 后进先出(LIFO)

高频结论

  • 栈顶元素最先被删除
  • 栈底元素最后被删除
  • 栈最典型应用:递归、函数调用、表达式求值、括号匹配

栈与递归

递归依赖栈实现,因为每次调用都要保存现场,返回时再按相反顺序恢复。

2.5 队列

定义

只允许在一端插入、另一端删除的线性表。

特点

  • 先进先出(FIFO)

2.6 循环队列

定义

将顺序队列首尾相连,形成环状结构。

高频结论

  • 循环队列属于顺序存储结构
  • front 可以大于 rear,也可以小于 rear
  • front == rear 可能表示空,也可能表示满,取决于实现方式

2.7 链表

单链表

  • 每个结点只有一个后继指针
  • 不能直接找到前驱

双向链表

  • 每个结点有前驱指针和后继指针

循环链表

  • 最后一个结点指向头结点
  • 可从任意结点出发遍历全表

2.8 树与二叉树

二叉树性质

  1. 第 i 层最多有 2^(i-1) 个结点
  2. 深度为 k 的二叉树最多有 2^k - 1 个结点
  3. 叶子结点数 = 度为2的结点数 + 1

高频公式

若:

  • 叶子结点数 = n0
  • 度为1的结点数 = n1
  • 度为2的结点数 = n2

则:

  • n0 = n2 + 1
  • 总结点数 n = n0 + n1 + n2

满二叉树

  • 除叶子结点外,其他结点度都为2
  • 总结点数通常为奇数
  • 15 个结点的满二叉树有 8 个叶子结点

2.9 查找与排序

算法特性

  1. 有穷性
  2. 确定性
  3. 可行性
  4. 输入
  5. 输出

常见排序

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 快速排序
  • 堆排序

快速排序

  • 选基准元素
  • 一趟划分后左边不大于基准,右边不小于基准
  • 高频题:第一趟划分后序列是什么

堆排序

  • 先建堆,再调整
  • 建堆通常从 i = n/2 开始向前处理

第3章 程序设计基础

  • 结构化程序设计强调:自顶向下、逐步求精、模块化设计
  • 三种基本控制结构:顺序、选择、循环
  • 模块化有利于调试、维护和复用

第4章 软件工程基础

4.1 软件的特点

  1. 软件是逻辑实体
  2. 软件具有抽象性
  3. 软件依赖硬件和环境
  4. 软件复杂性高
  5. 软件不会磨损老化
  6. 软件开发涉及知识产权、法律、管理等社会因素

4.2 软件生命周期

  1. 可行性研究
  2. 需求分析
  3. 总体设计
  4. 详细设计
  5. 编码
  6. 测试
  7. 维护

4.3 需求分析

  • 任务:确定软件“做什么”
  • 文档:软件需求规格说明书(SRS)
  • 作用:设计依据、交流依据、测试和验收依据

4.4 软件设计

包括:

  1. 结构设计
  2. 数据设计
  3. 接口设计
  4. 过程设计

4.5 模块化设计原则

  • 高内聚、低耦合

4.6 软件测试

黑盒测试

  • 等价类划分
  • 边界值分析
  • 错误推测法
  • 因果图法

白盒测试

  • 语句覆盖
  • 判定覆盖
  • 条件覆盖
  • 路径覆盖
  • 基本路径测试

4.7 工具

  • DFD:分析工具
  • 数据字典 DD:分析工具
  • 系统结构图:设计工具
  • 程序流程图:程序流程表示工具

第5章 数据库设计基础

  • 数据库:长期存储在计算机中的有组织、可共享的数据集合
  • 数据库系统:数据库 + DBMS + 应用程序 + 用户

E-R图

  • 实体:矩形
  • 属性:椭圆
  • 联系:菱形

关系模型

  • 行:元组
  • 列:属性

关系运算

  • 选择:选行
  • 投影:选列

联系类型

  • 1:1
  • 1:m
  • m:n

高频结论

  • 关键字必须唯一标识元组
  • 一个部门对应多个职员、一个职员只属于一个部门:1:m

第二部分 C++语言知识

第1章 C++语言概述

  • C++ 兼容 C
  • 支持面向对象
  • 支持泛型
  • 支持重载、继承、多态、模板

标识符命名规则

  1. 由字母、数字、下划线组成
  2. 不能以数字开头
  3. 不能是关键字
  4. 大小写敏感

合法

  • _shape
  • count1
  • MyName

非法

  • 2a
  • -count
  • const

高频结论

  • go 不是关键字
  • unsigned 是关键字

第2章 数据类型

  • char
  • short
  • int
  • long
  • float
  • double
  • bool

高频结论

  • unsigned 不能修饰 float
  • 0 为假,非0为真

第3章 表达式与运算符

常见运算符

  • 算术:+ - * / %
  • 关系:> < >= <= == !=
  • 逻辑:&& || !
  • 自增自减:++ --

高频判断

若:

int a = 8;

则:

  • a && (a-1) 为真
  • a > (a-1) 为真
  • a < (a-1) 为假

第4章 基本控制结构

顺序结构

按书写顺序执行。

选择结构

if(条件) 语句1;
else 语句2;
switch(表达式){
case 常量: 语句; break;
default: 语句;
}

循环结构

for(初始化; 条件; 变化){ 循环体; }
while(条件){ 循环体; }
do{ 循环体; }while(条件);

第5章 数组、指针与引用

数组

int a[5];
  • 元素类型相同
  • 内存连续
  • 下标从0开始

高频例子

int a[5] = {1,3,5,7,9};

则:

  • a[2] = 5
  • a[3] = 7

指针

int *p;
  • 指针保存地址
int *p = a;

则:

  • *p == a[0]
  • *(p+2) == a[2]

二级指针

int **b;
  • *b 是一级指针
  • **b 是最终数据

动态内存

int *p = new int;
int *a = new int[10];
delete p;
delete[] a;

字符串空间申请

new char[strlen(p)+1]

多出的1是给 \0

引用

int x = 100;
int &r = x;
  • 引用是别名
  • 改 r 就是改 x

参数传递

  • 值传递:不影响实参
  • 引用传递:影响实参
  • 指针传递:可通过 * 改实参

第6章 函数

函数重载

构成条件:

  • 参数个数不同
  • 参数类型不同
  • 参数顺序不同

高频结论

  • 不能仅凭返回值不同构成重载

默认参数

  • 必须从右向左连续设置

正确

void fun(int a, int b = 7, char *p = "**");

内联函数

  • inline
  • 类内定义的成员函数,编译器常视作内联候选

高频结论

  • C++ 不允许函数嵌套定义

第7章 类和对象

类的定义

class MyClass{
private:
    int x;
public:
    void setX(int a);
};

默认访问权限

  • class 默认 private
  • struct 默认 public

构造函数

特点:

  1. 名字与类名相同
  2. 没有返回类型
  3. 对象创建时自动调用
  4. 可以重载

高频结论

  • 构造函数不能写 void
  • 构造函数中可以用 this

析构函数

  • 名字为 ~类名
  • 无返回类型
  • 无参数
  • 一个类只有一个析构函数

const成员函数

void print() const;
  • 不能修改对象状态

静态成员

  • 静态数据成员属于整个类
  • 静态成员函数只能直接访问静态成员

友元

  • 友元函数不是成员函数,但可访问私有成员
  • 友元类可访问另一个类的私有成员

复制构造函数

ClassName(const ClassName &obj);

调用场景:

  1. 用对象初始化对象
  2. 按值传对象
  3. 函数返回对象

第8章 继承和派生

基本形式

class Derived : public Base{
};

继承方式

  • public
  • protected
  • private

默认继承

  • class 默认 private 继承

高频结论

  • 派生类不能直接访问基类 private 成员

初始化列表

Derived(int i) : Base(i), n(i) {}

构造与析构顺序

构造:

  1. 基类
  2. 成员对象
  3. 派生类

析构相反。

高频结论

  • 成员对象初始化顺序看声明顺序,不看初始化列表顺序

第9章 多态、虚函数与抽象类

虚函数

virtual void foo();

作用:

  • 通过基类指针或引用实现运行时多态

高频结论

  • 基类指针指向派生类对象,调用虚函数时执行派生类版本
  • 按值传递对象会发生切片,多态失效

纯虚函数

virtual float GetArea() = 0;

抽象类

特点:

  1. 含纯虚函数
  2. 不能定义对象
  3. 可定义指针和引用
  4. 派生类若不实现纯虚函数,仍为抽象类

第10章 运算符重载

基本原则

  1. 不能改变优先级
  2. 不能改变结合性
  3. 不能改变操作数个数
  4. 不能创造新运算符

不能重载的运算符

  • .
  • ::
  • .*
  • ->*
  • ?:

只能作为成员函数重载的运算符

  • =
  • []
  • ()
  • ->
  • 类型转换运算符

成员函数方式

c1 + c2  等价于  c1.operator+(c2)

下标运算符

int& operator[](int index){
    return data[index];
}

第11章 模板

函数模板

template<typename T>
T add(T a, T b){
    return a + b;
}

类模板

template<typename T1, typename T2>
class Test{
public:
    void foo(T2 t);
};

高频结论

  • 模板参数中 typenameclass 通常等价

类模板成员函数类外定义

template<typename T1, typename T2>
void Test<T1, T2>::foo(T2 t){
}

第12章 C++流与文件

预定义流对象

  • cin:标准输入
  • cout:标准输出
  • cerr:标准错误输出
  • clog:带缓冲错误输出

文件流类

  • ifstream
  • ofstream
  • fstream

打开方式

  • ios::in
  • ios::out
  • ios::app
  • ios::binary
  • ios::trunc

高频结论

  • 文件末尾追加用 ios::app

格式控制

  • setw(n):设置宽度,通常只影响下一次输出
  • setfill(ch):设置填充字符
  • left/right:左对齐/右对齐
  • fixed:定点输出
  • setprecision(n):配合 fixed 时保留 n 位小数

第三部分 上机操作题总库

1. 基本操作题

常见错误类型

  1. 构造函数名写错
  2. const 用错
  3. 成员函数声明和定义不一致
  4. 初始化列表错误
  5. 逻辑条件写反
  6. 变量名拼写不一致
  7. 漏写 类名::
  8. char*char[] 类型不匹配
  9. 静态函数中访问普通成员
  10. 继承权限写错

高频逻辑错法

  • closed == true 表示门关着
  • 所以判断门开着应写 !closed

2. 简单应用题

抽象类模板

class Shape{
public:
    virtual float GetArea() = 0;
    virtual float GetPerim() = 0;
};

Circle模板

class Circle : public Shape{
private:
    float r;
public:
    Circle(float radius) : r(radius) {}
    float GetArea(){ return 3.14f * r * r; }
    float GetPerim(){ return 2 * 3.14f * r; }
};

Rectangle模板

class Rectangle : public Shape{
private:
    float len, width;
public:
    Rectangle(float l, float w) : len(l), width(w) {}
    float GetArea(){ return len * width; }
    float GetPerim(){ return 2 * (len + width); }
};

基类指针多态模板

Shape *sp;
sp = new Circle(5);
cout << sp->GetArea() << endl;
delete sp;

sp = new Rectangle(4, 6);
cout << sp->GetArea() << endl;
delete sp;

3. 综合应用题

深拷贝模板

class CDeepCopy{
private:
    int *p;
    int n;
public:
    CDeepCopy(int k){
        n = k;
        p = new int[n];
    }

    CDeepCopy(const CDeepCopy& r){
        n = r.n;
        p = new int[n];
        for(int i = 0; i < n; i++)
            p[i] = r.p[i];
    }

    CDeepCopy& operator=(const CDeepCopy& r){
        if(this != &r){
            delete[] p;
            n = r.n;
            p = new int[n];
            for(int i = 0; i < n; i++)
                p[i] = r.p[i];
        }
        return *this;
    }

    ~CDeepCopy(){
        delete[] p;
    }
};

删除数组元素模板

for(int j = i; j < counter - 1; ++j)
    elem[j] = elem[j+1];
--counter;
--i;

去负数模板

void filter(){
    for(int i = 0; i < counter; ++i){
        if(elem[i] < 0){
            for(int j = i; j < counter - 1; ++j)
                elem[j] = elem[j+1];
            --counter;
            --i;
        }
    }
}

下标运算符模板

int& operator[](int index){
    return data[index];
}

边界判断模板

if(i < m_Len)
    return data[i];
else
    return 0;

排序交换模板

Person p = ps[m];
ps[m] = ps[i];
ps[i] = p;

第四部分 高频判断题结论库

  1. 二叉链表是非线性结构。
  2. 循环链表能从任意结点遍历全表。
  3. 栈是后进先出。
  4. 队列是先进先出。
  5. 循环队列是顺序存储结构。
  6. 递归调用依赖栈。
  7. 链式存储一般比顺序存储更占空间。
  8. 线性链表插入删除通常不需要移动元素。
  9. 二叉树叶子结点数 = 度为2的结点数 + 1。
  10. 第 i 层最多 2^(i-1) 个结点。
  11. 软件不会磨损和老化。
  12. 软件功能确定属于需求分析阶段。
  13. 设计阶段包括结构、数据、接口、过程设计。
  14. 黑盒测试:等价类、边界值、错误推测。
  15. 白盒测试:语句覆盖、路径覆盖、基本路径。
  16. E-R图:实体矩形,属性椭圆,联系菱形。
  17. 选择是行,投影是列。
  18. 关键字必须唯一标识元组。
  19. 标识符不能以数字开头。
  20. go 不是关键字。
  21. unsigned 不能修饰 float
  22. 不能仅凭返回值不同构成函数重载。
  23. 默认参数从右向左连续设置。
  24. C++ 不允许函数嵌套定义。
  25. 构造函数没有返回类型。
  26. 构造函数可以重载。
  27. 构造函数中可以用 this
  28. class 默认访问权限是 private。
  29. const成员函数不能修改对象状态。
  30. 静态成员函数不能直接访问非静态成员。
  31. 默认继承方式是 private。
  32. 派生类不能直接访问基类 private 成员。
  33. 成员对象初始化顺序看声明顺序。
  34. 构造顺序:基类→成员对象→派生类。
  35. 析构顺序相反。
  36. 含纯虚函数的类是抽象类。
  37. 抽象类不能定义对象。
  38. 运算符重载不能改变操作数个数。
  39. []=()、-> 常考成员函数重载。
  40. 模板参数中 typenameclass 通常等价。
  41. cin 是标准输入。
  42. cout 是标准输出。
  43. ios::app 表示追加。
  44. setw() 一般只影响下一次输出。
  45. fixed + setprecision(3) 表示保留3位小数。
  46. 字符串申请空间要 strlen + 1
  47. new[] 对应 delete[]
  48. 深拷贝不能只复制地址。
  49. 复制构造在按值传对象时会触发。
  50. 上机最常考:抽象类、深拷贝、数组删除、下标重载、继承初始化。

第五部分 高频模板库

1. 抽象类模板

class Shape{
public:
    virtual float GetArea() = 0;
    virtual float GetPerim() = 0;
};

2. 深拷贝模板

ClassName(const ClassName& r){
    n = r.n;
    p = new int[n];
    for(int i = 0; i < n; i++)
        p[i] = r.p[i];
}

3. 赋值运算符模板

ClassName& operator=(const ClassName& r){
    if(this != &r){
        delete[] p;
        n = r.n;
        p = new int[n];
        for(int i = 0; i < n; i++)
            p[i] = r.p[i];
    }
    return *this;
}

4. 删除元素模板

for(int j = i; j < count - 1; ++j)
    a[j] = a[j+1];
count--;
i--;

5. 下标运算符模板

T& operator[](int index){
    return data[index];
}

6. 派生类构造模板

Derived(int i) : Base(i), n(i) {}

7. 基类指针多态模板

Base *p = new Derived();
p->foo();
delete p;

8. 文件追加模板

ofstream fout("a.txt", ios::app);

第六部分 高频易错点总库

1. 选择题易错点

  • 把循环队列看成链式结构
  • 把递归和队列联系起来
  • 把选择和投影搞反
  • 把黑盒和白盒方法搞反
  • 认为只靠返回值不同也可重载
  • 认为构造函数返回 void
  • 认为默认参数从左到右设置
  • 认为抽象类可以直接定义对象

2. 改错题易错点

  • 漏掉 类名::
  • const 位置错误
  • 少写 friend
  • 少写 virtual
  • 漏写 =0
  • 初始化列表拼写错误
  • 变量名不一致
  • new[] 后用错 delete

3. 综合题易错点

  • 深拷贝写成浅拷贝
  • 删除元素后不 --i
  • 成员对象初始化顺序理解错
  • 类模板成员函数类外定义写不全
  • 运算符重载函数头写错
  • 静态函数中访问普通成员

pulished by jokerbai

作者名片

Jokerbai
Jokerbai
@Jokerbai

这个作者暂时还没有填写个人简介。

评论区
文章作者和管理员都可以管理这里的评论。
0 条评论
登录后即可参与评论。 去登录
还没有评论,欢迎留下第一条交流内容。