70 C++对象模型探索。C++ 几种调用构造函数实例化在编译器内部的不同,去了解这些不同后,我们就知道在代码中如何实例化对象是最优化的。

本节研究是的构造函数相关,所以我们第一步先回忆一下之前学习的构造方法的写法,以及使用构造函数实例化类的写法

一 从之前学习了构造方法的 使用举例,来看编译器在程序员写了代码后的做了些什么,这个要从 vs2017的C++编译器和Linux下g++编译器 都做了什么?

class Teacher33 {
public:Teacher33() {cout << "Teacher33 的 构造函数 被调用 " << this << endl;}//带有一个参数的构造函数也叫做 类型转换构造函数Teacher33(int age) :mage(age) {cout << "Teacher33 的 有参数的 构造函数 被调用 " << this << endl;}Teacher33(const Teacher33 &obj) :mage(obj.mage) {cout << "Teacher33 的 copy构造函数 被调用 " << this << endl;}virtual ~Teacher33() {cout << "Teacher33 的 析构函数 被调用 " << this << endl;}
public:int mage;
};void main(){//旧的回忆Teacher33 tea1;cout << "-----1------" << endl;Teacher33 tea2(10);cout << "-----2------" << endl;Teacher33 tea3 = 1000;cout << "-----3------" << endl;Teacher33 tea4 = Teacher33(888);cout << "-----4------" << endl;Teacher33 tea5 = (Teacher33)999;cout << "-----5------" << endl;}

在vs 2017上代码运行的结果如下:

Teacher33 的 构造函数 被调用 0000009F576FF5E8
-----1------
Teacher33 的 有参数的 构造函数 被调用 0000009F576FF618
-----2------
Teacher33 的 有参数的 构造函数 被调用 0000009F576FF648
-----3------
Teacher33 的 有参数的 构造函数 被调用 0000009F576FF678
-----4------
Teacher33 的 有参数的 构造函数 被调用 0000009F576FF6A8
-----5------
Teacher33 的 析构函数 被调用 0000009F576FF6A8
Teacher33 的 析构函数 被调用 0000009F576FF678
Teacher33 的 析构函数 被调用 0000009F576FF648
Teacher33 的 析构函数 被调用 0000009F576FF618
Teacher33 的 析构函数 被调用 0000009F576FF5E8

疑问:

我们看到结果是如上的代码都调用了构造方法,这显然和我们的预期不同,

至少在如下的这一行,就不应该只有构造函数被调用。

Teacher33 tea4 = Teacher33(888);

验证问题

将如上的代码放在linux下运行,并且用命令告诉g++不要优化代码。

命令为:其中a.cpp 为源文件名,-o 后面的aobj是你命名的文件名字

g++ -fno-elide-constructors a.cpp -o aobj

运行后

结果为:

Teacher33 的 构造函数 被调用 0x7ffcc93afd30
-----1------

Teacher33 有参数的 构造函数 被调用0x7ffcc93afd40
-----2------
Teacher33 有参数的 构造函数 被调用 0x7ffcc93afd60   //这玩意应该是个临时变量
Teacher33 Teacher33 的 copy构造函数 被调用 0x7ffcc93afd50
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd60 //析构这个临时变量
-----3------
Teacher33 有参数的 构造函数 被调用 0x7ffcc93afd80
Teacher33 Teacher33 的 copy构造函数 被调用 0x7ffcc93afd70
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd80
-----4------
Teacher33 有参数的 构造函数 被调用 0x7ffcc93afda0
Teacher33 Teacher33 的 copy构造函数 被调用 0x7ffcc93afd90
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afda0
-----5------
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd90
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd70
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd50
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd40
Teacher33 Teacher33 的 析构函数 被调用 0x7ffcc93afd30

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/643233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

含源码|基于MATLAB的去雾系统(5种去雾算法+1种本文的改进算法)

去雾系统V2包括作者新加入的多尺度Retinex去雾算法以及改进去雾算法&#xff0c;以及4种评价去雾效果的客观指标。 00 目录 引言 去雾系统新增功能 结果分析 源码获取 展望 参考文献 01 引言 在作者前面写过的文章中&#xff0c;已经介绍过图像去雾算法的应用价值及研究现…

java web mvc-05-JSF JavaServer Faces 入门例子

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …

Redis学习指南(29)-Redis高性能特性之多路复用模型

Redis是一种高性能的键值存储系统&#xff0c;它以其快速和可扩展性而受到广泛关注。在Redis高性能的背后&#xff0c;有许多关键特性与机制在起作用。其中之一是多路复用模型&#xff0c;它在Redis中起到了至关重要的作用。 多路复用模型是指单个线程能够同时处理多个客户端连…

计算机网络中的网络地址转换

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、什么是网络地址转换 &#xff08;NAT&#xff09;&#xff1f;二、NAT 如何工作&#xff1f;NAT协议的主要用途NAT 内部和外部地址网络中的 NAT 类型网络地…

绝地求生:本周三停机维护更新4小时: RASH悲喜套装即将下线!

本周三将迎来停机维护更新四小时~&#xff0c;同时游戏商城内RASH悲喜联名套装即将下线&#xff0c;同时空投签到任务和荣都地图翻牌任务即将下线~ 预计维护时间: 2024年1月24日08:00~12:00 本周地图轮换情况 (1月24日 ~ 1月31日) 可自主选择地图的地区:艾伦格、泰戈、帝斯顿、…

DL/T 645 协议学习笔记

一、多功能电能表通信协议 DL/T645多功能电能表通信协议&#xff08;Multi-function watt-hour meter communication protocol&#xff09;标准是为统一和规范电能表的多功能电能表与数据终端设备进行数据交换时的物理连接和协议。 1、RS-485 标准串行电气接口 本标准采用 RS-…

按键控制LED灯

目录 文件夹Hardware&#xff1a; 文件LED.c: 文件LED.h: 文件Key.c: 文件Key.h: 文件夹User&#xff1a; 文件main.c: 首先模块化管理代码 文件夹Hardware&#xff1a; 文件LED.c: // 引入STM32F10x系列微控制器的头文件&#xff0c;包含了一些基本的寄存器和函数声…

5.Python爬虫前的准备工作

知识准备 1) Python语言 Python 爬虫作为 Python 编程的进阶知识&#xff0c;要求具备较好的 Python 编程基础 了解 Python 语言的多进程与多线程&#xff0c;并熟悉正则表达式语法&#xff0c;也有助于编写爬虫程序 2) Web前端 了解 Web 前端的基本知识&#xff0c;比如 …

2-项目介绍

项目介绍 1.文件结构 1.1.后端结构 com.ruoyi ├── common // 工具类 │ └── annotation // 自定义注解 │ └── config // 全局配置 │ └── constant // 通用…

用Netty手写Http/Https服务器

Netty是一个以事件驱动的异步通信网络框架&#xff0c;可以帮助我们实现多种协议的客户端和服务端通信&#xff0c;话不多说&#xff0c;上代码&#xff0c;需要引入下方依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artif…

BUU LFI COURSE 1

靶场教程 1.开局界面&#xff0c;已给出源代码。2.存在文件包含include &#xff0c;直接通过传参 file 进行获取 flag。3.通过访问 url 发现报错&#xff0c;说明 flag 并不在当前目录下&#xff0c;只需要向前访问目录即可。 http://b6ed0fd6-c852-40d0-b285-32d9d00fbf00.…

抖去推短视频矩阵系统+实景无人直播系统技术源头开发

抖去推爆款视频生成器&#xff0c;通过短视频矩阵、无人直播&#xff0c;文案引流等&#xff0c;打造实体商家员工矩阵、用户矩阵、直播矩阵&#xff0c;辅助商家品牌曝光&#xff0c;团购转化等多功能赋能商家拓客引流。 短视频矩阵通俗来讲就是批量剪辑视频和批量发布视频&a…

查询小世界账号网页HTML源码

HTML源码&#xff0c;记事本打开后可以修改里面的内容&#xff0c;电脑本地双击html可以查看效果&#xff0c;复制小世界个人主页链接就可以查询QQ号&#xff0c; 蓝奏云&#xff1a;https://wfr.lanzout.com/ihXCn1lz2jnc

MySQL数据库面试知识点

1、数据库基础&#xff1a; MySQL是一个开源的关系型数据库管理系统&#xff0c;用于存储、管理和检索数据。它支持多种存储引擎&#xff0c;包括InnoDB、MyISAM等。MySQL是由瑞典公司MySQL AB开发&#xff0c;后来被Sun Microsystems收购&#xff0c;最终被甲骨文公司(Oracle…

4G物联网LED智慧路灯杆显示屏产品介绍

4GLED显示屏是一种具有4G网络连接功能的LED显示屏。它可以通过4G网络连接到互联网&#xff0c;实现远程管理和控制&#xff0c;方便进行内容更新和管理。同时&#xff0c;4GLED显示屏具有高亮度、高清晰度和高对比度的特点&#xff0c;可以提供清晰明亮的图像和视频展示效果。它…

stm32产品架构

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 起因是我在看野火的ucosiii&#xff0c;然后他是基于i.mx芯片。然后我就很疑惑i.mx是什么芯片&#xff0c;看了下好像是ARM-M7(或者叫ARMCM7)架构的芯片。然后我又疑惑ARM-M7又是什么架…

omron adept控制器维修SmartController EX

欧姆龙机器人adept运动控制器维修SmartController EX 19300-000 维修范围&#xff1a;姆龙机器人&#xff1b;码垛机器人&#xff1b;搬运机器人&#xff1b;焊机机器人&#xff1b;变位机等。 Adept Viper s650/s850用于装配、物料搬运、包装和机械装卸&#xff0c;循环周期短…

二进制?十进制!(C语言刷题)(位运算)

专栏:https://blog.csdn.net/2301_79293429/category_12545690.html 题目描述 给定两个十进制整数 : A,B 你需要把它们的二进制形式以十进制的运算法则相加输出结果。 例如&#xff1a; A3,B2的时候&#xff0c;A 的二进制表示是 : 11 , B 的二进制表示是 10 &#xff0c;…

物流实时数仓——概述与准备工作

目录 一、架构设计与技术栈 (一)数仓架构设计 (二)所用技术栈 (三)最终效果 二、关于离线与实时的相关概念 三、实时数仓设计思路 一、架构设计与技术栈 (一)数仓架构设计 (二)所用技术栈 Hadoop 3.3.4 Zookeeper 3.7.1 Kafka 3.3.1 Hbase 2.4.11 Redis 6.0.8 Flink 1.17…

mysqldump添加从库或者重新同步从库

一、GTID添加从库的方法 1.如果master所有的binlog还在&#xff0c;安装slave后&#xff0c;直接change master 到master 原理是直接获取master所有的gtid并执行 优点是简单 缺点是如果binlog太多&#xff0c;数据完全同步需要的时间较长&#xff0c;并且需要master一开始就启…