美文网首页
默认构造函数的生成时机

默认构造函数的生成时机

作者: 404Not_Found | 来源:发表于2021-08-21 01:03 被阅读0次
  • 作者: 雪山肥鱼
  • 时间:20210822 00:58
  • 目的: 默认构造函数的生成实际

默认构造函数不是每次都生成的

默认构造函数并不是每次都生成的。以下述代码为例 同时开发环境为
vs2017

对象作为类成员

class MATX
{
public:
};

class MBTX
{
public:
    int m_i;
    int m_j;
    void funct()
    {
        cout << "euaihls" << endl;
    }
};

int main(int argc, char ** argv)
{
    MBTX myb;
    return 0;
}

生成项目
打开 vs2017 开发人员命令提示符
进入项目的DEBUG路径
输入

dumpbin /all main.obn > my.txt

拖到vs2017里。 搜索 MBTX::MBTX 没有任何信息

默认构造函数生成时机

class MATX
{
public:
    MATX()
    {
        cout << "euaihlsMATX" << endl;
    }
};

class MBTX
{
public:
    int m_i;
    int m_j;
    void funct()
    {
        cout << "euaihls" << endl;
    }
    MATX ma;
};

int main(int argc, char ** argv)
{
    MBTX myb;
    return 0;
} 
  • MBTX 没有构造函数,但是包含了一个成员变量,类型是个对象
    1. MATX, MBTX 都没有默认构造函数,则都不会生成默认构造函数
    2. MBTX 有默认构造函数,但是MATX 没有,则MATX 不会生成默认构造函数
  1. MATX 有默认构造函数 MBTX 没够构造函数,则 MBTX会生成默认构造函数,合成的目的是调用MATX, 并且在 MBTX中安插代码,用来调用 MATX::MATX() 构造函数.
    MBTX(默认生成) 调用 MATX构造函数.png

子类无构造函数,父类有构造函数

子类和父类之间的构造函数生成关系如下:
子类无默认构造函数,父类有默认构造函数,编译器会为子类合成一个默认构造函数

class MATX
{
public:
    MATX()
    {
        cout << "euaihlsMATX" << endl;
    }
};

class MBTXParent
{
public:
    MBTXParent()
    {
        cout << "MBTXPARENT()" << endl;
    }

};

class MBTX: public MBTXParent
{
public:
    int m_i;
    int m_j;
    void funct()
    {
        cout << "euaihls" << endl;
    }
};

int main(int argc, char ** argv)
{
    MBTX myb;
    return 0;
}
结果.png

默认生成的子类构造函数中,会调用父类构造函数

带有虚函数的类

因为虚函数的存在,就注定会有虚函数表,构造函数中的动作:
把虚函数表地址赋值给对象中的 vptr。

class MBTX
{
public:
    int m_i;
    int m_j;

    //可以看下 构造函数中额外的新增代码
    MBTX()
    {
        m_i = 15;
    }
    
    virtual void mvirfunc()
    {
        cout << "mvirfunc" << endl;
    }

    void funct()
    {
        cout << "euaihls" << endl;
    }
};

int main(int argc, char ** argv)
{
    MBTX myb;
    return 0;
}
构造函数中的vftable.png

虚函数表的位置:


vftable.png

在vs2017 反汇编中的代码


对vftable 进行赋值.png

虚基类

钻石结构.png

虚基类结构:Grand 无构造函数, Father A, Father A2 无构造函数
Son C 无构造函数。
则在创建 Son C 中 会默认给 C A A2 合成默认构造函数

class Grand
{
public:
};

class A : virtual public Grand
{
public:
};

class A2 : virtual public Grand
{
public:

};

class C : public A, public A2
{
public:

};

int main(int argc, char ** argv)
{
    C cc;
    return 0;
}

vbtable 虚基类的表:
默认的构造函数,A, A2 分别存有 一个 vbtable。
类似这种


vbtable.png

C 中的结构


C的结构.png

虚基类了解到此即可,后续有机会深入研究再谈。

相关文章

  • Flutter 6种构造函数详解

    Flutter有生成构造函数、默认构造函数、命名构造函数、重定向构造函数、常量构造函数、工厂构造函数 一.生成构造...

  • 《java编程思想》读书笔记之初始化与清理

    1.只有在没有默认构造函数的时候,编译器才会默认生成一个,当用户定义了构造函数,编译器便不会再生成默认构造函数。 ...

  • C++ class类初始化

    默认构造函数法 生成对象的方式: 构造函数初始化列表 生成对象的方式:

  • c++复制构造函数

    自定义复制构造函数会使编译器不生成默认构造函数 默认的构造函数是指为所有参数都提供了默认值的构造函数,通常是指无参...

  • java-构造函数

    (1)一个类如果不声明构造函数会生成一个默认的无参构造函数.如果声明了构造函数(无论有参还是无参),就不会生成默认...

  • 12-05构造析构

    构造。析构函数的出现时机 对象生成时会自动调用构造函数,但由于不同作用域的对象生命周期不同,构造函数出现的时机也不...

  • C++:再论构造函数分类和调用时机以及匿名对象

    原创请注明出处: 我们这里主要讨论构造函数的构造函数的分类和其调用时机测试类如下: 1、默认构造函数和无参构造函数...

  • 构造函数篇

    1.构造函数: 如果一个类没有显示的申明构造函数,那么,系统就会默认给你生成无参的构造函数,和一个默认的拷贝构造,...

  • 构造函数

    构造函数 在 class 中,可以不写默认构造函数,编译器会默认生成。 在构造函数中,尽量使用初始化列,但是会有陷...

  • 在 JS 中,关于函数的执行时机

    函数是一种对象,函数是由 Function 构造的 函数的要素 每个函数都有默认的调用时机 函数的调用时机 && ...

网友评论

      本文标题:默认构造函数的生成时机

      本文链接:https://www.haomeiwen.com/subject/biqciltx.html