类相关概念

  • 面向对象5大基本原则:单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)、接口隔离原则(ISP)。
  • 可变数据成员:一个可变数据成员永远不会是const,即使它是对const对象的成员。因此,一个const成员函数可以改变一个可变成员的值。如:
1
2
3
4
5
6
7
8
9
10
11
12
class A
{
public:
void fun() const;
private:
mutable int a;
};

void A::fun() const
{
a = 0;
}
  • 构造函数初始值列表:如果成员是const,引用或者属于某种为提供默认构造函数的类类型,我们必须通过构造函数初始值列表为这些成员提供初始值。建议使用构造函数初始值列表,一是效率更高,二是避免意想不到的错误。
  • 委托构造函数:一个委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程。如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A
    {
    public:
    A(int _a, string _b) : a(_a), b(_b) {}
    A() : A(0, " ") {}
    private:
    int a;
    string b;
    }
  • 聚合类:所有成员都是public;没有定义任何构造函数;没有类内初始值;没有基类,也没有virtual函数。

  • 类的静态成员:静态成员函数在类外定义的时候不用谢static关键字,static关键字只出现在类内部的声明语句中;静态成员变量还可以作为成员函数的默认实参;静态成员变量能应用于某些场景,然而普通成员不行,如下:

    1
    2
    3
    4
    5
    6
    class A
    {
    static A a; //正确,静态成员可以是不完全类型
    A* p_a; //正确,指针成员可以是不完全类型
    A a_; // 错误,构造时会错误
    }
  • 三/五法则:a. 需要析构函数的类也需要拷贝和赋值操作;b. 需要拷贝构造函数则需要拷贝赋值运算符,反之亦然;

  • 引用限定符:引用限定符可以是&或&&,类似const限定符,只能用于非static成员函数,且必须同时出现在函数的声明和定义中。对于&限定的函数,只能用于左值,对于&&限定的函数,只能用于右值。若const限定符同时出现,必须放在const限定符的后面。
  • const对象只能调用自己的const方法。
  • 关于纯虚函数,我们可以为纯虚函数提供定义,不过函数体必须定义在类的外部;含有纯虚函数的类就是抽象基类。
  • public,protect,private继承,可以改变个别成员的可访问性,通过使用using声明,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class Base
    {
    public:
    std::size_t size() const { return n; }
    protected:
    std::size_t n;
    };

    class Derived : private Base
    {
    public:
    using Base::size;
    protected:
    using Base::n;
    };
  • 定义在派生类中的同名函数会隐藏基类中的同名函数,即使参数不同,也不会进行重载。那么说明派生类中的虚函数必须与基类中的虚函数完全一致,否则会被隐藏。

  • 重载多态和强制多态是指特定多态。参数多态和包含多态是指通用多态。