C++知识

  1. vector的reserve和resize

    vector的reserve增加了vector的capacity,但是size没有改变;resize改变了vector的capacity,同时也增加了它的size。原因:reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新对象之前,不能引用容器内元素,加入新元素要调用push_back()或insert()函数;resize是改变容器大小,且在创建对象,因此调用这个函数后就可以引用容器内的对象,所以加入新的元素时可以用operator[]操作符,或者迭代器来引用该元素。

  2. C++的虚函数和纯虚函数

    虚函数是允许被派生类重新定义的成员函数。声明方式:virtual returntype func(parameter); 定义一个函数为虚函数,是为了实现动态绑定,允许用基类的指针来调用子类的函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class A  
    {
    public:
    virtual void foo()
    {
    cout<<"A::foo() is called"<<endl;
    }
    };
    class B:public A
    {
    public:
    void foo()
    {
    cout<<"B::foo() is called"<<endl;
    }
    };
    int main(void)
    {
    A *a = new B();
    a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
    return 0;
    }

    通过这个例子,可以知道,它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。

    纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”。纯虚函数最显著的特征是:它们必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口

  3. 基类的虚析构函数

    为了防止内存泄漏。想去借助父类指针销毁子类对象的时候,不能销毁子类对象。假如没有虚析构函数,释放一个由基类指针指向的派生类对象时,不会触发动态绑定,则只会调用基类的析构函数,不会调用派生类的。派生类中申请的空间则会得不到释放而导致内存泄漏。

  4. const和static

    初始化:通常在类外申明static成员,但是static const的整型(bool, char, int, long)可以在类中声明并初始化,static const的其他类型必须在类外初始化(包括整型数组)。

    用法:

    • static作用:

      1. 局部变量:在局部变量前加关键字static,局部变量就被定义为一个局部静态变量。在内存中的位置是静态存储区,未经初始化的会被程序自动初始化为0。作用域为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
      2. 全局变量:在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。在内存中的位置是静态存储区,未经初始化的会被程序自动初始化为0。作用域是在声明他的文件之外是不可见的。

      注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置(从原来的栈中存放改为静态存储区)及其生命周期(局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问),但未改变其作用域。

      ​ 当static修饰全局变量,并未改变其存储位置及生命周期,而是改变了其作用域,使当前文件外的源文件无法访问该变量,好处如下:(1)不会被其他文件所访问,修改(2)其他文件中可以使用相同名字的变量,不会发生冲突。

  5. extern关键字:https://www.cnblogs.com/banmei-brandy/p/11338314.html