码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++对象模型(12)-- 构造函数语义学:构造函数


    1、默认构造函数生成规则

    编译器不一定会为类生成默认构造函数,但在下列情况下,编译器会生成默认构造函数。

    (1)该类没有任何构造函数,但包含一个类类型的成员变量,且成员变量所属的类有默认构造函数。

    (2)该类没有任何构造函数,但其父类有默认构造函数。

    (3)该类没有任何构造函数,但含有虚函数

    因为虚函数会产生虚函数表指针,而这个虚函数表指针需要在构造函数中生成。

    1. MyDemo::MyDemo{
    2. this->_vptr = 0x00BC;
    3. }

    (4)类带有虚基类

    因为需要在构造函数中生成虚基类表指针。

    1. MyDemo::MyDemo{
    2. this->_vbptr = 0x00BC;
    3. }

    (5)对成员变量进行了大挂号或等号初始化。

    1. class MyDemo{
    2. private:
    3. int x = 1;
    4. int y(2)
    5. }

    编译器合成的默认构造函数如下(伪代码):

    1. MyDemo::MyDemo{
    2. this->x = 1;
    3. this->y = 2;
    4. }

    2、验证默认构造函数生成规则

    上面生成默认构造函数的5条规则,我们可以通过VS2019来验证。

    (1)没有生成默认构造函数

    1. class MyDemo {
    2. };
    3. int main()
    4. {
    5. MyDemo demo;
    6. return 0;
    7. }

    我们把断点设在第8行:return 0 的位置。运行后打开“反汇编”窗口,可以看到如下代码:

    (2)生成默认构造函数

    给MyDemo类增加代码,使其满足第5条规则。

    1. class MyDemo {
    2. private:
    3. int x = 1;
    4. };

    可以看到反汇编代码中有调用构造函数的代码:call MyDemo::MyDemo,也就是说这个时候MyDemo类生成了默认构造函数。

    关于其他4条生成默认构造函数的规则,读者可以用同样的方法去验证。

    3、继承中的对象构造

    首先我们要知道继承中的对象构造规则:由内而外,即先构造父类对象,再构造子类对象。

    我们可以用下面的代码验证继承中的对象构造顺序:

    1. class Base {
    2. public:
    3. Base() { cout << "Base::Base()" << endl; }
    4. };
    5. class Derive : public Base {
    6. public:
    7. Derive() { cout << "Derive::Derive()" << endl; }
    8. };
    9. int main()
    10. {
    11. Derive derive;
    12. return 0;
    13. }

    执行后的结果可以看到:

    Base::Base()

    Derive::Derive()

  • 相关阅读:
    DIY 万利 ST-LINK II 更改成 ST-Link V2
    mescroll 在uni-app 运行的下拉刷新和上拉加载的组件
    2022-8-30 第七小组 学习日记 (day54)JavaWeb、Servlet、HTTP-请求 响应、乱码问题
    2023第三届中国数字化人才国际峰会
    Python中OpenCV库(二)
    带临床数据的热图 -- 给样品添加TNM分期、年龄、性别、riskscore等信息
    如何应对数仓资源不足导致的核心任务延迟
    基于SSM + MySQL的零食购物平台系统的设计与实现源码
    Java | Leetcode Java题解之第130题被围绕的区域
    Python 学习之路: 常用断言汇总
  • 原文地址:https://blog.csdn.net/mars21/article/details/133892755
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号