启程 C++ / 杂谈 · 2022年2月9日 0

C++面向对象考前重点速览

复习方法:

  • 抓重点:原理性概念是重点,实现方法次之,小技巧与概念再次之
  • 从大往小复习:
    • 先了解每个章节内容的逻辑原理,即:实现程序设计过程中的什么功能
    • 再关注细节,即:如何实现这些功能
  • 整理一套笔记,帮助自己反复记忆原理
  • 参考网络上的学习资料,能看懂幻灯片与网络资料的程序代码
    • https://www.runoob.com/cplusplus/cpp-tutorial.html
    • http://c.biancheng.net/cplus/
    • http://www.weixueyuan.net/cpp/rumen/
    • 在线编译工具:https://www.onlinegdb.com/online_c++_compiler

第一章:面向对象的概述

  • 为什么要编程?
    让机器去完成我们设计的任务。
  • 问题一:如何和机器有效沟通,让你机器去理解我们想要告诉它的任务?(类)
  • 问题二:如何高效、省时省力的完成程序设计的任务?(继承、模板、STL)

    如何解决问题一:
    • 模仿人类之间的沟通方式,设计与机器的沟通方式
    • 人类世界由物体、以及物体与物体之间的关系构成
    • 编程的任务,可以构建为物体,以及物体与物体之间的关系
    • 解决方法(模拟人类世界):在电脑的世界里,定义物体、以及物体与物体之间的关系,在与机器的沟通中(编程),直接调用模块化的物体,从而降低沟通成本

第三章:类的定义

  • 我们需要一种统一标准化的方式去定义物体、以及物体与物体之间关系的方法
    • 所有程序猿都能轻松掌握的定义方法
    • 适用于所有物体的标准化的定义方法
  • 类(class):定义物体的方法
    • 属性(attributes,variables):定义物体所具有的属性、参数
    • 方法(functions,methods):定义物体的功能,描述物体与物体之间关系
    • 电脑所理解的物体:具有类所定义属性,可以实现类所定义方法的功能体
  • 对象(object):
    • 根据类的定义所产生的,占用电脑真实资源(内存、CPU等),可以真实进行数据处理的单元
  • 对象与类的区别:
    • 对象由类的构造函数实例化产生,是真实在软件运行中进行数据处理的单元
    • 类是对象的定义方式,是功能体的概念
    • 类是概念,对象是类的实现
  • C++程序的构成
    • 类文件
      • .h (头文件):描述类的定义方法
      • .cpp (执行文件):对类定义的函数方法的具体实现过程描述
      • 一个.h文件可以定义多个类。与其对应的.cpp文件,需要#include “*.h”其头文件
    • main函数:C++程序的入口函数
      • 通常定义在main.cpp文件中
  • 面向对象基本特点:
    • (1) 将客观事物看作具有属性(数据)和行为(函数)的对象
    • (2) 通过抽象找出同一类对象的共同属性和行为,形成类
    • (3) 通过类的继承与多态实现代码重用
  • 面向对象的几个主要特征:抽象、封装、继承和多态。

第四章:类与对象

  • 构造函数:(constructor)
    • 类中用于生成对象的函数
    • 功能:
      • 1. 为对象分配内存空间和地址(由系统自动完成)。
      • 2. 对初始生成的对象进行属性的定义
    • 一个类可以有多个构造函数。其函数名都是类名称,返回类型均为类对象,参数列表可有区别,用于根据不同传入参数初始化对象
    • 构造函数是类中唯一一个函数名与类名一致的函数

引自:http://c.biancheng.net/cpp/biancheng/view/194.html

  • 对象的生成
    • 直接定义对象(也叫非new方式创建)
      • A a; //无参构造函数,和基本变量定义一样的发方式
      • A a = A(); //无参构造函数
      • A a = A(参数列表); //有参构造函数
    • 动态建立对象(new操作创建)
      • A *a = new A;
      • A *a = new A(参数列表);
  • 拷贝构造
    • 通过使用另一个同类型的对象来初始化新创建的对象
  • 浅拷贝与深拷贝(不做考试要求)
    • 浅拷贝:仅将对象指针指向需要拷贝的对象
    • 深拷贝:创建独立对象,并将拷贝对象数据拷贝至新建对象
  • 析构函数
    • 销毁对象的方法,是构造函数的反操作
    • 一个类只有一个析构函数,无返回值,无参数
  • this指针:指向自身的指针
  • const关键字:保证数据安全的一种实现方法

第五章:继承与衍生

  • 什么是继承?为什么要继承?
    • 扩展已有类的方法,生成衍生类,更好地实现设计目标
    • 实现不同程序猿的协同,程序猿A定义基类,B需要使用时可扩展生成其子类,而不用重新定义基类
  • 子类将继承父类的所有属性和方法
  • 属性和方法的可见性由public,protected,private关键字控制

第六章:多态

  • 函数重载
  • 运算符重载
    • 对数学运算符进行重新定义,从而对类对象可以重用运算符,
  • 虚函数
#include<iostream>
using namespace std;

// 基类 Father
class Father {
public:
    void display() {
        cout<<"Father::display()\n";
    }
    // 在函数中调用了,子类覆盖基类的函数display()
    void fatherShowDisplay() {
        display();
    }
};

// 子类Son
class Son:public Father {
public:
    // 重写基类中的display()函数
    void display() {
        cout<<"Son::display()\n";
    }
};

int main() {
    Son son;                  // 子类对象
    son.fatherShowDisplay();    // 通过基类中未被覆盖的函数,想调用子类中覆盖的display函数
}

使用虚函数:

#include<iostream>

using namespace std;

// 基类 Father
class Father {
public:
    virtual void display() {
        cout<<"Father::display()\n";
    }

    // 在函数中调用了,子类覆盖基类的函数display()
    void fatherShowDisplay() {
        display();
    }
};

// 子类Son
class Son:public Father {
public:
    // 重写基类中的display()函数
    void display() {
        cout<<"Son::display()\n";
    }
};

int main() {
    Son son;                    // 子类对象
    son.fatherShowDisplay();    // 通过基类中未被覆盖的函数,想调用子类中覆盖的display函数
}

  • 纯虚函数
    • 仅定义函数名,不定义函数实体
  • 抽象类
    • 具有虚函数的类
    • 定义了接口,外界知道有一个固定名称的函数存在

第七章:流类库

  • 打开文件
    • 文件可分为文本文件和二进制文件
    • 文本文件,又称ASCII文件,每个字节存放一个ASCII码,代表一个字符
    • 二进制文件把内存中的数据按照其在内存中的存储形式原样写到磁盘上存放
    • 最初设计流类库的目的是用于文本,因此默认情况下,文件以文本方式打开
  • 文件流对象定义在fstream头文件,共有三类:
    • ifstream(读文件)、ofstream(写文件)、fstream(读写文件)
  • 读取和写入文件
    • 借助ofstream,实现文本文件输出
      • 如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的
      • //ofstream输出流对象默认以trunc模式打开的
      • ofstream myFile(“filename”);
      • 可以在调用默认构造函数之后使用open成员函数打开文件
      • ofstream myFile;        //声明一个静态文件输出流对象
      • myFile.open(“filename”);//打开文件,使流对象与文件建立联系
      • 在构造对象或用open打开文件时可以指定模式
      • ofstream myFile(“filename”, ios_base::out | ios_base::binary);
    • 文本文件的读写
      • 可以借助插入运算符<<实现内容写入
      • 如下:
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

int main (){
    char buffer[256];
    ifstream in("example.txt");
    if (!in.is_open()){
        cout << "Error opening file"; exit (1);
    }
    while (!in.eof()){
        //getline()函数的作用是逐行读取,这里就是读取流in中的数据
        in.getline(buffer,100);
        cout<<buffer<< endl;
    }
    return 0;
}

// 向文件中写入数据(向文件输出)
#include <fstream>
using namespace std;
int main()
{
    ofstream out("example.txt");
    if (!out.is_open()) //!运算符已经重载
    {
        return false;
    }
    else{
        out << "This is a line.\n";
        out << "This is another line.\n";
        out.close();
    }
    return 0;
}

第八章:模板

  • 面向对象的思想:封装,继承和多态
  • 泛型程序设计(generic programming) 的思想:模板机制,以及标准模板库 STL,简单地说就是使用模板的程序设计法
  • 泛化:定义一个面向不同数据结构,可以通用的函数(函数模板)和类(类模板)
  • 标准模板库STL (Standard Template Library) 就是一些常用数据结构和算法的模板的集合。
  • 模板的概念:
    • 所谓模板是一种使用无类型参数来产生一系列函数或类的机制
    • 若一个程序的功能是对某种特定的数据类型进行处理,则可以将所处理的数据类型说明为参数,以便在其他数据类型的情况下使用,这就是模板的由来。
    • 模板是以一种完全通用的方法来设计函数或类而不必预先说明将被使用的每个对象的类型。
    • 通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从而避免需要为每一种数据类型产生一个单独的类或函数。
  • 模板类
    • 类模板具有未明确定义的数据类型,不能直接实例化对象
    • 类模板确定数据类型后,称为模板类。模板类可实例化对象

第九章:STL

  • C++标准类库提供的模板类,替代链表等复杂数据结构的方法
  • 容器(container),算法(algorithm),迭代器(iterator)构成
    • 容器:vector,list,map,set等
    • 算法:可实现对容器内数据的增、删、查、改
    • 迭代器:指向固定位置的指针,是定向获取容器内数据的指针

第十章:异常处理

  • 程序的错误有两种,一种是编译错误,即语法错误;另一种是在运行时发生的错误,它分为不可预料的逻辑错误和可以预料的运行异常。
  • 异常处理机制是用于管理程序运行期间错误的一种结构化方法
  • C++语言异常处理机制的基本思想是将异常的检测与处理分离,即由try, through, catch构成
    • Try:定义异常处理所关注的代码区域
    • Through:抛出异常
    • Catch(参数列表):根据through所抛出异常的参数类型,捕获异常后,执行所定义的函数体
  • 优点:实现异常监测与异常处理的分离。在不终止程序运行的情况下,实现异常处理,是大型程序设计的关键技术。

第十一章:UML类图

  • 类的表达方法
  • 类的关系
  • 多重对应
  • 要求:可以根据题目,画出UML类图,实现类的定义