0%

c++知识点

  1. 为什么拷贝构造函数必须为引用?

    避免拷贝构造函数无限制的递归,最终导致栈溢出。

    因为如果拷贝构造函数的参数不是引用的话,那么就是值传递。而值传递本身又会调用拷贝构造函数,拷贝构造函数又是值传递,值传递又会调用拷贝构造函数……导致无限递归下去。

  2. 构造函数的隐式调用

    对已经实例化的对象赋值调用的是赋值函数,对还没实例话的对象赋值调用的是拷贝构造函数,这里使用的就是拷贝构造函数的隐式调用。

    如:

     A a;
     a = b; 调用的是赋值函数
    
     A a(b); 调用的也是拷贝构造函数
    
     A a = b; 调用的是拷贝构造函数(隐式调用)
    
  3. C++类对象的初始化顺序

    构造函数调用顺序:

     1. 按照派生类继承基类的顺序,即派生列表中声明的顺序,依次调用基类的构造函数;
     2. 按照派生类中成员变量的声名顺序,依次调用派生类中成员变量所属类的构造函数;
     3. 执行派生类自身的构造函数。
    

    综上可以得出,类对象的初始化顺序:基类构造函数–>派生类成员变量的构造函数–>自身构造函数

    注:

     基类构造函数的调用顺序与派生类的派生列表中的顺序有关;
     成员变量的初始化顺序与声明顺序有关;
     析构顺序和构造顺序相反。
    
  4. 为什么用成员初始化列表会快一些?

    原因:用户自定义类型如果使用类初始化列表,直接调用该成员变量对应的构造函数即完成初始化;如果在构造函数中初始化,因为 C++ 规定,对象的成员变量的初始化动作发生在进入构造函数本体之前,那么在执行构造函数的函数体之前首先调用默认的构造函数为成员变量设初值,在进入函数体之后,调用该成员变量对应的构造函数。因此,使用列表初始化会减少调用默认的构造函数的过程,效率高。

Welcome to my other publishing channels