C++学习笔记

来自多彩世界 2020-11-07

初始化

//一致性初始化
int values[]{1, 2, 3};
vector<int> v{2, 4, 5, 6};
vector<string> cities{"beijing", "shanghai", "henan"};

const

const修饰符紧接于成员函数参数列表之后,以此告诉编译器:该成员函数不会改变其调用者的值。如果已在class内声明的成员函数已指定const,则其在class外的定义中也要指定const。

在const方法中,其只能访问调用者的数据成员,不能修改调用者的数据成员,也不能调用其他的非const方法。const修饰的指针对象只能访问其对象类中的const成员函数。

class Triangular
{
public:
    int length() const { return _length; }
    int beg_pos() const { return _beg_pos; }
    //在成员函数声明时指定const
    int elem(int post) const;

    bool next(int &val);
    void next_reset() { _next = _beg_pos - 1; }

private:
    int _length;
    int _beg_pos;
    int _next;

    static vector<int> _elems;
};

//在外部定义时也要加上const
int Triangular::elem(int post) const
{
    return _elems[post - 1];
}

int main()
{
    const Triangular *triangular = new Triangular();
    //常量指针对象只能访问const方法
    triangular->elem(1);
    return 0;
}

static

static数据成员用来表示唯一的、可共享的成员,它可以在同一类的所有对象中被访问。

static vector<int> _elems;

explicit

如果类中构造函数只有一个参数,那么可以将该参数类型的数据直接赋值给类对象,这种构造函数被称为转换函数。为了阻止构造函数的这种转换行为,可以在构造函数前使用explicit关键字。

class CBird
{
public:
    int m_nWidght;
    CBird(int Widght) //构造函数,也可作为转换函数
    {
        m_nWidght = Widght;
    }
};

int main()
{
    CBird bird = 20; //自动进行类型转换
    return 0;
}
class CBird
{
public:
    int m_nWidght;
    explicit CBird(int Widght) //阻止构造函数自动转换
    {
        m_nWidght = Widght;
    }
};

int main()
{
    CBird bird = 20; //错误
    return 0;
}

对象何时调用析构函数

在栈中构建的对象会在作用域消失时自动调用析构函数,在堆中构建的对象需要调用delete运算符来调用析构函数。

//在栈中构建对象
Triangular triangular1;
//在堆中构建对象
Triangular *triangular2 = new Triangular();
delete triangular2;

virtual

基类中的成员函数用virtual关键字修饰时,此函数定义为虚函数,在其派生类中重新定义该函数时,无论派生类中重新定义的成员函数是否使用virtual关键字,该函数永远是虚函数。

通过在基类中使用virtual修饰成员函数,在派生类中覆盖此成员函数,就实现了所谓的多态。

函数重载

编译器会根据方法的参数个数、参数类型和方法属性(const方法)来区分不同的方法,这3项也被称为方法的签名。方法的返回值类型不作为区分方法重载的标记。

继承

多态

父类定义一个虚函数时,子类能够改写这个函数现实自己的行为。当定义一个父类对象并采用子类的构造函数构建对象时,父类对象在调用虚函数时将根据实际构建的对象类型来确定调用哪个类的虚函数。

class Shape
{
public:
    virtual void DrawShape()
    {
        cout << "画一个形状" << endl;
    }
};

class Circle : public Shape
{
public:
    void DrawShape()
    {
        cout << "画一个圆形" << endl;
    }
};

class Rectangle : public Shape
{
public:
    void DrawShape()
    {
        cout << "画一个矩形" << endl;
    }
};

int main()
{
    Shape *shape = new Rectangle();
    shape->DrawShape();
    delete shape;

    shape = new Circle();
    shape->DrawShape();
    delete shape;

    return 0;
}

抽象类

在虚函数后面加上“=0”即定义了纯虚函数,包含纯虚函数的类称为抽象类,抽象类不能被实例化。