• 类的构造函数执行顺序


    背面经的时候,发现了历史遗留问题,一直没深入理解,今天的摸索中有所进展~

    问题:

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

    First Q:类的初始化方式

    a) 赋值初始化:在函数体内进行初始化;

    b)列表初始化:在冒号后使用初始化列表进行初始化。

    两者的区别:

    赋值初始化:在函数体中进行初始化,在数据成员被分配内存进行;

    列表初始化:在进入函数体前,在数据成员分配内存空间就进行初始化;

    写法如下:

     Second Q:构造函数执行顺序

    父类:Parent                子类:Child1

    父类:有参构造函数     子类:有参构造【初始化列表方式】

    父类:无对象                子类:父类对象 p

    代码:

    1. class Parent
    2. {
    3. public:
    4. Parent(int x) {
    5. cout << "父类构造:" << x<<endl;
    6. }
    7. ~Parent() {
    8. cout << "父类析构" << endl;
    9. }
    10. };
    11. class Chlid1 :public Parent
    12. {
    13. public:
    14. Chlid1(int a,int b):Parent(a),p(b) {
    15. cout << "子类构造函数" << endl;
    16. }
    17. ~Chlid1() {
    18. cout << "子类析构函数" << endl;
    19. }
    20. private:
    21. Parent p;
    22. };
    23. int main(){
    24. Chlid1 c(1,2);
    25. return 0;
    26. }

     执行顺序:

    父类构造函数->子类对象成员构造函数->子类构造函数->子类析构函数->子类对象成员析构函数->父类析构函数

    结果如下:

     Third Q:为什么初始化列表快一点

    **先定义一个 Child 类,在类中定义三个函数:默认构造函数、拷贝构造函数、赋值运算符;

    **再定义两个测试类,Test1、Test2;

    **Test1 中采用 赋值初始化;

    **Test2中采用列表初始化;

    如下所示:

    1. class Child2
    2. {
    3. private:
    4. int a;
    5. public:
    6. Child2()
    7. { cout << "我是无参构造"<< endl; }
    8. Child2(const Child2&)
    9. {
    10. cout << "我是拷贝构造" << endl;
    11. }
    12. Child2& operator=(const Child2&)
    13. {
    14. cout << "我是赋值运算符" << endl;
    15. return *this;
    16. }
    17. };

     运行一下,看会出现什么结果:

     可以看出,初始化列表的方法不会再次调用无参构造函数和赋值运算符,而是直接调用拷贝构造函数,省去了一次构造函数的步骤。

    原因:因为赋值操作是会产生临时变量的,所以调用两次构造函数。

  • 相关阅读:
    使用cmd连接数据库
    Linux内核的配置和编译(3)——Linux内核加载自己的驱动(编译最新内核Linux-5.18.7)
    软阴影(PCF、PCSS)
    Linux线程同步(条件变量)
    【CMake】第1篇 了解 CMake 构建源码输出 Hello world(初学者必备)
    Jenkins如何做到parameter页面里2个参数的联动
    redis缓存穿透、击穿、雪崩介绍
    Android焦点控制和键盘弹出
    简易版的新闻应用
    [ICCV-23] DeformToon3D: Deformable Neural Radiance Fields for 3D Toonification
  • 原文地址:https://blog.csdn.net/qq_57328462/article/details/125634443