类的初始化

类成员初始化方式?构造函数的执行顺序 ?为什么用成员初始化列表会快一些?

赋值初始化,通过在函数体内进行赋值初始化;列表初始化,在冒号后使用初始化列表进行初始化。

  • 对于在函数体中初始化,是在所有的数据成员被分配内存空间后才进行的。
  • 列表初始化是给数据成员分配内存空间时就进行初始化
  • 方法一是在构造函数当中做赋值的操作,而方法二是做纯粹的初始化操作。
  • C++的赋值操作是会产生临时对象的。临时对象的出现会降低程序的效率。

一个派生类构造函数的执行顺序如下:

  • 虚拟基类的构造函数(多个虚拟基类则按照继承的顺序执行构造函数)。
  • 基类的构造函数(多个普通基类也按照继承的顺序执行构造函数)。
  • 类类型的成员对象的构造函数(按照初始化顺序)
  • 派生类自己的构造函数。

有哪些情况必须用到成员列表初始化?作用是什么?

  • 当初始化一个引用成员时
  • 当初始化一个常量成员时;
  • 当调用一个基类的构造函数,而它拥有一组参数时;
  • 当调用一个成员类的构造函数,而它拥有一组参数时;

成员初始化列表做了什么?

  • 编译器会一一操作初始化列表,以适当的顺序在构造函数之内安插初始化操作,并且在任何显示用户代码之前;
  • list中的项目顺序是由类中的成员声明顺序决定的,不是由初始化列表的顺序决定的;

成员初始化列表的概念,为什么用它会快一些?

  • 在初始化列表中,如果是"类"这种数据类型,会少一次调用默认构造函数的过程
  • 而在函数体中赋值则会多调用一次
  • 如果是在构造函数体内进行赋值的话,等于是一次默认构造加一次赋值,而初始化列表只做一次赋值操作
#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
        cout << "默认构造函数A()" << endl;
    }
    A(int a)
    {
        value = a;
        cout << "A(int "<<value<<")" << endl;
    }
    A(const A& a)
    {
        value = a.value;
        cout << "拷贝构造函数A(A& a):  "<<value << endl;
    }
    int value;
};

class B
{
public:
    B() : a(1)
    {
        b = A(2);
    }
    A a;
    A b;
};
int main()
{
    B b;
}

//输出结果:
//A(int 1)
//默认构造函数A()
//A(int 2)
posted @ 2023-02-21 10:56  小秦同学在上学  阅读(60)  评论(0编辑  收藏  举报