一、基本概念

  1. 对象(Object)
  2. 消息传递(Message Communication)
  3. **封装(Encapsulation):**将数据和方法捆绑在一起,隐藏数据处理的细节,限制仅对公开的方法的访问
  4. **抽象(Abstraction):**隐去实现细节,关注更高维度的问题,需要模块化设计(Modularization)

二、类的定义与多文件编程

  1. Class 与 Struct 的区别

  2. 类的定义方法

    使用头文件和源文件分离的方式定义类,每定义一个类应当建立两个文件:

    **示例:**Point 类的定义和使用

    // Point.h
    class Point{
    private:
        int x, y;
    public:
        void init(int ix, int iy);
        void move(int dx, int dy);
    };
    
    // Point.cpp
    #include "point.h"
    #include <iostream>
    using namespace std;
    
    void Point::init(int ix, int iy){
        x = ix;
        y = iy;
    }
    
    void Point::move(int dx, int dy){
        x += dx;
        y += dy;
    }
    
    // main.cpp
    #include<iostream>
    #include "point.h"
    using namespace std;
    
    int main(){
        Point p;
        p.init(2, 3);
        p.move(5, 5);
    }
    
  3. 作用域解析运算符 Resolver ::

    示例:

    void S::f(){    // 定义类 S 的 f 函数
    	::f();        // 调用全局作用域的 f 函数
    	::a++;        // 对全局作用域的 a 变量操作
    	a--;          // 对当前作用域的 a 变量操作
    }
    
  4. 编译单元 Computation Unit

  5. 文件关系图

    image.png

<aside> 📌

若要为函数的参数指定默认值,只能在函数声明处指定,在函数实现处不能写

</aside>

三、构造函数和析构函数

1. 构造函数 Constructor

  1. 构造函数与类名 / 结构体名完全相同,可以有参数,没有返回类型

  2. 默认构造函数

  3. 构造函数的调用时机

    对象被创建时,构造函数会被调用:

    示例:

    struct Y{
        int i;
        Y(int a) { i = a; }        // 含参的构造函数
    };
    struct Z{
        int i;
        Z(int a) { i = a; }        // 含参构造函数
        Z() { i = 0; }             // 默认构造函数(需手动定义)
    };
    int main(){
        Y y1[2] = {Y(1), Y(2)};    // 正常工作
        Y y2[3] = {Y(1), Y(2)};    // 报错,y2[2] 的创建需调用默认构造函数,而我们没有定义,编译器也没有为其创建
        Z z1[3] = {Z(1), Z(2)}:    // 正常工作
    }
    
  4. 聚合初始化 Aggregate Initialization

  5. 初始化列表 Initializer List