《面向对象程序设计基础》C++第二版复习笔记

2022-04-01  本文已影响0人  东也_

第一章 程序设计与C++语言初步

  1. 算法:用来解决问题的、由多个步骤组成的具体过程称为算法;
  2. 实体
  1. 编译程序和解释程序的区别:前者是将整个高级语言程序翻译成及其语言,最后再执行。后者是逐句的翻译,每翻译一句就执行一句;
  2. 程序设计是一种编写计算机程序的活动,是为了解决某一特定问题而构造一种专门工具的活动;
  3. 结构化程序设计:主要技术是自顶向下、逐步求精、采用单入口/出口的控制结构;
  4. 面向对象程序设计:它是建立在结构化程序设计上的,最重要的改变是程序围绕被操作的数据来设计,而不是围绕操作本身;面向对象更偏向于将程序设计为一组相互的协作的对象而不是一组相互协作的函数
  5. 一种语言主要由语法的两部分组成:语法和语义;
  1. 定义语法常用的定义方法是Backus - Naur(简称BNF)和语法图;
  1. 一个程序是实体的属性和行为在计算机中的表示;C++中用类来描述实体,用来描述实体都具有的属性和行为。C++中的对象表示单个实体;

  2. C++语言是混合型面向对象程序设计语言,因为除了类之外还可以包括游离于类之外的函数;Java 就是纯面向对象程序设计语言;

  3. C++程序的运行过程

  1. 面向对象程序设计的过程就是一个建模过程,模拟现实世界或思维世界的各种现象;将想象抽象成实体概念,再将实体概念建模形成一个个类,再通过将类具体化成对象就可以模拟现实世界的各种行为;

  2. 面向对象程序设计的特征:数据封装(封装对象行为的实现细节)、继承(模型化一般和特殊的关系)、多态性(一个名字,多种语义)

第二章 基本数据类型

  1. C++有四种基本类型:字符类型、整数类型、浮点类型、空值类型;还有四种复合数据类型:指针类型、引用类型、函数类型、自定义类型/构造类型;其中的构造类型包括:数组类型、枚举类型、结构体类型、共用体类型、类类型;

  2. C++中有五种单词:保留字(int float)、标识符(变量名)、常量(字符常量、数字常量)、运算符(= + - > <)、分解符(;);

  3. 常量和变量

  1. 输入和输出
  1. C++ 基本数据类型的存储方式:
数据类型 类型名称 占用字节
字符类型 char 1
整数类型 int 2
浮点类型 float 4
双精度类型 double 8
空值型 void 0
  1. 隐士类型转换
  1. C++使用文件作为划分模块的主要机制;

第三章 基本控制结构

比较简单 没什么需要记录的;

第四章 函数

  1. 函数的调用过程
  1. 内联函数
  1. 函数参数的缺省值
  1. C++的变量有四种存储类型:自动变量、寄存器变量、静态变量、外部变量;

(1)自动变量只能修饰局部变量,有关键字auto 修饰,所有为声明的未指定类别的局部变量都是自动变量;
(2)寄存器变量用register关键字修饰,说明将这个变量的值存到寄存器中使用,以提高和修改该变量的时间效率。因为寄存器是是在CPU中,当CPU中的寄存器超限时,寄存器变量会自动转换为自动变量。常用于循环变量和数组下标等频繁使用的变量;
(3)静态变量既可以是局部变量也可以是全局变量。但无论是那种情况,静态变量都具有全局生命周期,直到程序运行结束;静态变量初始化值默认是0,静态局部变量的初始化是在程序运行中第一次经过它的时候完成,初始化只做一次;声明静态变量使用static修饰;作用域仅限于文件内使用;
(4)外部变量分为定义性声明和引用性声明,前者是带有初始化,后者是未初始化;一个全局变量默认就是定义性声明外部变量,未初始化则初值为0;带有extern声明的定义性变量必须是全局变量,而带有extern的引用性变量既可以是全局的也可以是局部的;它的初始化工作在执行main函数之前就已经完成;一个变量必须且只有一个定义性声明,但是有可以有多次引用性声明;

如果声明自动变量和寄存器变量时没有进行初始化,则它们的初始值是随机的;

  1. 当一个块内声明的局部变量屏蔽了同名的全局变量时,可以用作用于运算符:: 访问被屏蔽的全局变量;

  2. 预处理命令

  1. 常用库函数
  1. 模板函数
template <class T, typename D>
T square(T x) {

    return x * x;
}

第五章 类与对象

  1. 类是一组具有相同属性,表现相同行为对象的描述;
  2. 类成员有三种访问控制方式:public、protected(默认行为)、private;
    3.定义一个类的写法:
    C++中通常类名通常用大写字母表示
class 类名 {

public: 
  公有数据和函数
private:
  私有数据和函数
};
  1. 类中的任何数据成员在声明不允许使用auto、register、extern关键字进行修饰,但允许使用static;
  2. const 不仅可以修饰数据成员也可以修饰成员函数,成员函数的const加在函数末尾;
    常量函数中可以改变局部变量、全局变量或其他类对象的值,但不予许修改本对象数据成员的值;
    只有类的函数可以成为常量函数;
int get_value() const;

int get_value() const {
  
}
  1. 类实现文件中的函数定义形式:
    返回类型 类名::函数名(参数) {
    函数体
    }
  2. 在将类文件和类实现分开,或者在他文件模块引用其他的类时,需要使用MAKE和PROJET工具将类实现文件的目标链接在一起才能生成可执行文件;因为使用的是VSCode,在mac下配置环境整不明白,只能自己写Makefile了;
    以下示例使用make工程管理器,链接多文件编译
    定义三个文件模块:CIRLE_NUMBER.hpp CIRLE_NUMBER.cpp main.cpp
/*
循环计数器
*/
 class CIRCLE_NUMBER {
    public:
        void set_model(int min, int max){
            min_value = min;
            max_value = max;
            current = this->min_value;
            return;
        }
        void increment();
        void decrement();
        int get_current_val();
        void set_current_value(int value);
    private:
        int max_value;
        int min_value;
        int current;
};



#include "CIRCLE_NUMBER.hpp"

void CIRCLE_NUMBER::decrement() {
    

}

void CIRCLE_NUMBER::set_model(int min , int max) {

            min_value = min;
            max_value = max;
            current = this->min_value;
            return;


}


        void CIRCLE_NUMBER::increment() {

            int model = max_value - min_value + 1;

            current = (current - min_value + 1) % model + min_value;

        }


        void CIRCLE_NUMBER::decrement() {

            int model = max_value - min_value;

            // 当current == min_value 时 加上model不至于为负数 
            current = (current - min_value - 1 + model) % model + min_value;


        }

        int CIRCLE_NUMBER::get_cuurent_val() {
            return current;
        }

        void CIRCLE_NUMBER::set_current_value(int value) {

            current = value;

        }

#include <iostream>
#include "CIRCLE_NUMBER.hpp"
using namespace std;
int main() {

    CIRCLE_NUMBER circle;
    circle.set_model(10,20);
    circle.increment();
    circle.decrement();
    circle.decrement();
    cout << "current == " << circle.get_cuurent_val() << endl;
    return 0;
}

创建makefile文件,如:my_makefile,在执行make的时候会自己寻找叫makefile的文件,如果是其他名字 需要使用make -f 文件名
内容如下:
在使用VSCode编辑Makefile时,有可能命令的缩进不能识别,使用时可能报缺少分割符,使用vim编辑TAB即可解决

objects = practise2.o CIRCLE_NUMBER.o

exe: $(objects)
    g++ -o exe $(objects)
.o : main.cpp
    g++ -c main.cpp
CIRCLE_NUMBER.o: CIRCLE_NUMBER.cpp
    g++ -c CIRCLE_NUMBER.cpp
clean: 
    rm exe $(objects)
  1. 类类型的变量就是对象,对象通常用小写表示;
  2. 访问对象的成员使用选择运算符".";
  3. 构造函数
CIRCLE_NUMBER::CIRCLE_NUMBER(): count(55), constVariable(100),min_value(10) {
    
    std::cout << "倒计时器 构造函数被调用" << std::endl;
    return;
}
  1. 全局对象和静态对象的构造函数在main函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到相应的声明语句才被调用;
  2. 析构函数
  1. 基本数据类型的变量和对象变量本质上是一样的,基本数据类型也可以使用对象的初始化方式;如:int test(10);
  2. 重载是允许一个运算符或函数名字具有多重含义的机制;
  3. 在一个类文件模块访问其他的类,可以用class 声明的方式;但是声明成员对象必须使用指针变量。如果使用include方式就不需要;
  4. 友元

第六章 复合数据类型

  1. 一个变量有四个要素组成:一个名字(标识符)、一个属性(类型)、一个关联(变量的内存地址)、一个值(变量内存地址存放的值);
  2. 变量的关联部分叫左值,变量的值部分叫右值;
  3. 指针
// 下面三种变量都是指向的同一个age1
    int age1 = 100;
    int *age = &age1;

    int& quote_age = *age;

    quote_age = age1;

    cout << "指针地址:" << age << "  " << *age << endl;

    *age = 230;

    quote_age = 199;

    age1 = 50;

    cout << "指针地址:" << age << "  " << *age << endl;
  1. 数组
  1. 指针数组是指数组中的元素是指针变量;如:int * array[10],也可以不写字符个数,在定义的时候自动识别;

  2. 数组指针是指基类型为数组类型的一个指针;如:int (array)[10],因为运算符[]的优先级高于指针运算符,所以array是一个指向数组的指针变量;

  3. 字符串常量

  1. 字符串变量
  1. 对象指针

11.函数指针

int fuctionPoint(int a, float fb) {

    
    return 99;
}

int main() {

    int (* variable)(int, float);

    variable = fuctionPoint;

    variable(88,55.5);
}
  1. 函数指针可以函数的参数,可以达到类似于一个回调的功能;
  2. 结构类型struct的作用与class非常相似,其区别在于没有成员访问控制访问方式;class的缺省是private,struct的是public;

第七章 继承机制

  1. 继承的语法是分号“:” 继承访问控制 父类{};继承访问控制部分是可选,用于规定基类成员在派生类中的访问控制方式。即基类成员在派生类中是公有的、受保护的还是私有的;缺省是private;
    2.即使父类的私有成员变量,子类也会分配父类的私有成员;派生类在继承时,成员访问控制声明为public,才能支持多态;
  2. 由于公有派生类型可以兼容基类型,所以指向基类对象的指针的指针变量也可以指向其公有派生类的对象;
  3. 在编写面向对象程序时,应尽可能使用指向类类型对象的指针,而少用对象本身。特别是作为函数参数传递与函数返回值的时候,直接使用对象会引起程序语义的复杂化;
  4. 派生类不继承基类的构造函数和析构函数,相反派生类的构造函数必须提供实际参数信息给基类的构造函数;
  5. 创造一个派生类的对象时,如果基类有构造函数则会先调用基类的构造函数,再调用派生类的构造函数;对象销毁时,析构函数的调用顺序则相反;
  6. 如果基类的构造函数带有参数,那么在派生类构造函数实现时必须使用初始化列表的方式将参数传递给基类;如果没有显示调用基类的构造函数,则默认调用积累中形式参数为空的构造函数;
  7. 使用private或者protected继承访问控制时可以屏蔽从基类继承下来的公有成员,这时可以使用访问声明将一些被屏蔽公有成员恢复到原来的访问控制状态;一般形式为:基类名:: 成员名,这样声明在派生类中的相关区域中;注意:重声明原有成员时,只能恢复原来的成员访问控制,并不能改变;
  8. 解决重复集成二义性问题的方法是虚基类,虚基类可以保证在任何派生类中只提供一个基类的副本;
  9. 派生类在继承时,可以规定基类为虚基类。在成员访问控制符前面 加一个virtual关键字;如: class 派生类: virtual public 基类名;
  10. 对于虚基类构造函数的调用总是先于普通基类的构造函数调用;

第八章 多态性

  1. 多态性分为静态和动态两种,前者是编译时决定的,后者是运行时决定的。如用父类指向子类,在调用方法时调用的依然是父类的方法。如果将要调用的函数改成虚函数就会变成调用子类的方法;虚函数用virtual 修饰;
  2. 运行时多态性是指必须等到程序动态运行时才可确定的多态性,主要通过集成结合动态绑定获得;普通函数使用的是静态绑定,而虚函数使用的是动态绑定;
  3. 重载函数暗示了一种关联,我们不应该重载哪些本质上有区别的函数,只有当函数实现的语义非常相近时才应使用函数重载。重载是通过形参的个数和对应位置的类型来区分的;
  4. 拷贝构造函数
class_name::classname(const class_name& object) {

}
  1. 虚函数
  1. 纯虚函数
  1. 抽象类

第九章 类属机制

  1. 类属类
#ifndef __GPERSON_HPP

#ifdef __GPERSON_HPP

template <class T, class D>
class Person {

    private:
    T test;

};

#endif
  1. 类属函数

第十章 输入/输出流

  1. 文件
  1. 流类库

剩下的以后再补充 ~~~~ 祝考试顺利!!

第十一章 面向对象软件构造

上一篇下一篇

猜你喜欢

热点阅读