当前位置: 首页 > news >正文

C++学习笔记(1):在默认构造函数内部使用带参数的构造函数

题目

以下代码的输出是不是0:

#include <unordered_map>
#include <iostream>using namespace std;struct CLS{int i;CLS(int i_) :i(i_){}CLS(){CLS(0);}
};int main(){CLS obj;std::cout << obj.i << endl;return 0;
}

结果

-858993460

为什么呢?

定义对象的流程

以下内容参考自:从一道题谈C++中构造函数调用构造函数 - 中土 - 博客园 (cnblogs.com)

  • 代码奇怪的地方在于构造函数中调用了自己的另一个构造函数,我们知道,当定义一个对象时,会按顺序做2件事情:

1)分配好内存(非静态数据成员是未初始化的)

2)调用构造函数(构造函数的本意就是初始化非静态数据成员)

  • 显然上面代码中,CLS obj;这里已经为obj分配了内存,然后调用默认构造函数,但是默认构造函数还未执行完,却调用了另一个构造函数,这样相当于产生了一个匿名的临时CLS对象,它调用CLS(int)构造函数,将这个匿名临时对象自己的数据成员m_i初始化为0;但是obj的数据成员并没有得到初始化。于是obj的m_i是未初始化的,因此其值也是不确定的

  • 验证:在析构函数中打印一个destroy,结果如下,可见生成了两个对象。

~CLS(){cout << "destroy" << endl;}destroy
-858993460
destroy

  • 从这里,我们归纳如下:

  1. 在c++里,由于构造函数允许有默认参数,使得这种构造函数调用构造函数来重用代码的需求大为减少

  1. 如果仅仅为了一个构造函数重用另一个构造函数的代码,那么完全可以把构造函数中的公共部分抽取出来定义一个成员函数(推荐为private),然后在每个需要这个代码的构造函数中调用该函数即可

解决方案:placement new

最好的方法当然是不调用,但偶尔我们还是希望在类的构造函数里调用另一个构造函数,可以按下面方式做:

在构造函数里调用另一个构造函数的关键是让第二个构造函数在第一次分配好的内存上执行,而不是分配新的内存,这个可以用标准库的placement new做到

inline void *__cdecl operator new(size_t, void *_P)
{return (_P); 
} 

placement new即为定位new,当需要在制定内存而不是新开辟一个内存构建新对象时,就使用之

  • 格式:

  • address:placement new所指定的内存地址

  • ClassConstruct:对象的构造函数

Object * p = new (address) ClassConstruct(...);

于是代码修改为:

#include <unordered_map>
#include <iostream>using namespace std;struct CLS{int i;CLS(int i_) :i(i_){}CLS(){new (this)CLS(0);} // 使用placement new
};int main(){CLS obj;std::cout << obj.i << endl;return 0;
}

这时的输出就是0了:

0
destroy

相关文章:

C++学习笔记(1):在默认构造函数内部使用带参数的构造函数

题目以下代码的输出是不是0&#xff1a;#include <unordered_map> #include <iostream>using namespace std;struct CLS{int i;CLS(int i_) :i(i_){}CLS(){CLS(0);} };int main(){CLS obj;std::cout << obj.i << endl;return 0; }结果-858993460为什么…...

Android面试题_安卓面经(23/30)设计模式源码案例

系列专栏: 《150道安卓常见面试题全解析》 安卓专栏目录见帖子 : 安卓面经_anroid面经_150道安卓基础面试题全解析 安卓系统Framework面经专栏:《Android系统Framework面试题解析大全》 安卓系统Framework面经目录详情:Android系统面经_Framework开发面经_150道面试题答案解…...

Dubbo性能调优参数以及原理

Dubbo作为一个服务治理框架&#xff0c;功能相对来说比较完善&#xff0c;性能也挺不错。但很多同学在使用dubbo的时候&#xff0c;只是简单的参考官方说明进行配置和应用&#xff0c;并没有过多的去思考一些关键参数的意义&#xff0c;最终做出来的效果总是差强人意,接下来我们…...

vue3全家桶之vuex和pinia持久化存储基础(二)

一.vuex数据持久化存储 这里使用的是vuex4.1.0版本,和之前的vuex3一样,数据持久化存储方案也使用 vuex-persistedstate,版本是最新的安装版本,当前可下载依赖包版本4.1.0&#xff0c;接下来在vue3项中安装和使用&#xff1a; 安装vuex-persistedstate npm i vuex-persisteds…...

LAMP架构与搭建论坛

目录 1、LAMP架构简述 2、各组件作用 3、构建LAMP平台 1.编译安装Apache httpd服务 2.编译安装mysql 3.编译安装php 4.搭建一个论坛 1、LAMP架构简述 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整台系统和相关软件&#xff0c;能够提供动…...

代码随想录 || 回溯算法93 78 90

Day2493.复原IP地址力扣题目链接给定一个只包含数字的字符串&#xff0c;复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。例如&#…...

界面组件Kendo UI for Angular——让网格数据信息显示更全面

Kendo UI致力于新的开发&#xff0c;来满足不断变化的需求&#xff0c;通过React框架的Kendo UI JavaScript封装来支持React Javascript框架。Kendo UI for Angular是专用于Angular开发的专业级Angular组件&#xff0c;telerik致力于提供纯粹的高性能Angular UI组件&#xff0c…...

【Linux】进程状态|优先级|进程切换|环境变量

文章目录1. 运行队列和运行状态2. 进程状态3. 两种特殊的进程僵尸进程孤儿进程4. 进程优先级5. 进程切换进程特性进程切换6. 环境变量的基本概念7. PATH环境变量8. 设置和获取环境变量9. 命令行参数1. 运行队列和运行状态 &#x1f495; 运行队列&#xff1a; 进程是如何在CP…...

合宙Air780E|FTP|内网穿透|命令测试|LuatOS-SOC接口|官方demo|学习(18):FTP命令及应用

1、FTP服务器准备 本机为win11系统&#xff0c;利用IIS搭建FTP服务器。 搭建方式可参考博文&#xff1a;windows系统搭建FTP服务器教程 windows系统搭建FTP服务器教程_程序员路遥的博客-CSDN博客_windows服务器安装ftp 设置完成后&#xff0c;测试FTP&#xff08;已正常访问…...

大规模 IoT 边缘容器集群管理的几种架构-4-Kubeedge

前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介大规模 IoT 边缘容器集群管理的几种架构-1-RancherK3s大规模 IoT 边缘容器集群管理的几种架构-2-HashiCorp 解决方案 Nomad大规模 IoT 边缘容器集群管理的几种架构-3-Portainer &#x1f4da;️Reference…...

Spring底层核心原理解析

Spring简介 ClassPathXmlApplicationContext context new classPathXmlApplicationContext("spring.xml"); UserService userService (UserService) context.getBean("userService"); userService.test();上面一段代码是我们开始学习spring时看到的&…...

OpenStack手动分布式部署Glance【Queens版】

目录 Glance简介 1、登录数据库配置&#xff08;在controller执行&#xff09; 1.1登录数据库 1.2数据库里创建glance 1.3授权对glance数据库的正确访问 1.4退出数据库 1.5创建glance用户密码为000000 1.6增加admin角色 1.7创建glance服务 1.8创建镜像服务API端点 2、安装gla…...

谈一谈你对View的认识和View的工作流程

都2023年了&#xff0c;不会还有人不知道什么是View吧&#xff0c;不会吧&#xff0c;不会吧。按我以往的面试经验来看&#xff0c;View被问到的概率不比Activity低多少哦&#xff0c;个人感觉View在Android中的重要性也和Activity不相上下&#xff0c;所以这篇文章将介绍下Vie…...

Redis集群的脑裂问题

集群脑裂导致数据丢失怎么办&#xff1f; 什么是脑裂&#xff1f; 先来理解集群的脑裂现象&#xff0c;这就好比一个人有两个大脑&#xff0c;那么到底受谁控制呢&#xff1f; 那么在 Redis 中&#xff0c;集群脑裂产生数据丢失的现象是怎样的呢&#xff1f; 在 Redis 主从架…...

互斥信号+任务临界创建+任务锁

普通信号量 1、信号量概念 2、创建信号量函数 3、互斥信号量 创建互斥信号量函数 等待信号量函数 释放互斥信号量 4、创建任务临界区 5、任务锁 任务上锁函数 ​编辑 任务结束函数 效果 普通信号量 1、信号量概念 信号量像是一种上锁机制&#xff0c;代码必须获…...

Elasticsearch7.8.0版本进阶——文档搜索

目录一、文档搜索的概述二、倒排索引不可变的优点三、倒排索引不可变的优点一、文档搜索的概述 早期的全文检索会为整个文档集合建立一个很大的倒排索引并将其写入到磁盘。 一旦新的索引就绪&#xff0c;旧的就会被其替换&#xff0c;这样最近的变化便可以被检索到。倒排索引被…...

spring security权限问题

org.springframework.boot spring-boot-starter-security 引入jar extends WebSecurityConfigurerAdapter 用来配置登陆和权限 configure(HttpSecurity http) 覆盖这个方法 //配置授权相关的 .authorizeRequests () //任何请求 .anyRequest() //要求授权后可以访问 .authen…...

mysql 8.0.22安装

mysql8.0.22安装1. 配置my.ini2. 添加环境变量3. 安装mysql3.1 mysql初始化3.2 安装mysql服务3.3 启动mysql服务4. 连接数据库修改连接数据库的密码前提&#xff1a;已经从官网下载mysql8.0.22安装包并解压&#xff08;下载地址&#xff1a;https://dev.mysql.com/downloads/in…...

Mysql系列:Mysql5.7编译安装

系统环境&#xff1a;Centos7 1&#xff1a;下载mysql源码包 https://dev.mysql.com/downloads/mysql/5.7.html downloads 选择MySQL Community Server>source_code>Generic Linux (Architecture Independent), Compressed TAR Archive -> 选择需要的mysql版本&…...

设备树(配合LED驱动说明)

目录 一、起源 二、基本组成 三、基本语法 四、特殊节点 4.1 根节点 4.2 /memory 4.3 /chosen 4.4 /cpus 多核CPU支持 五、常用属性 5.1 phandle 5.2 地址 --------------- 重要 5.3 compatible --------------- 重要 5.4 中断 --------------- 重要 5.5 …...

解锁B站4K视频下载:bilibili-downloader开源工具完全指南

解锁B站4K视频下载&#xff1a;bilibili-downloader开源工具完全指南 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 在数字内容爆炸的…...

ComfyUI Essentials:填补ComfyUI核心缺失功能的必备插件指南

ComfyUI Essentials&#xff1a;填补ComfyUI核心缺失功能的必备插件指南 【免费下载链接】ComfyUI_essentials 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_essentials ComfyUI Essentials是一款专门为ComfyUI用户设计的插件&#xff0c;它提供了ComfyUI核心…...

COMSOL 6.1版本皮秒多脉冲激光烧蚀模型:双温模型、变形几何与烧蚀模拟

COMSOL 6.1版本 皮秒多脉冲激光烧蚀模型 模型内容&#xff1a;涉及双温模型&#xff0c;变形几何&#xff0c;烧蚀&#xff0c;皮秒脉冲热源&#xff0c;电子、晶格温度 优势&#xff1a;模型注释清晰明了&#xff0c;各个情况都有涉及可参考性极强&#xff0c;可以修改&#x…...

从Shenyu网关的线程瓶颈说起:我是如何用gRPC长连接优化配置同步的(Raft实战)

从Shenyu网关的线程瓶颈到gRPC长连接优化&#xff1a;Raft协议实战解析 1. 问题背景与现状分析 在微服务架构中&#xff0c;API网关作为流量入口&#xff0c;其性能直接影响整个系统的稳定性。Apache Shenyu作为流行的开源网关解决方案&#xff0c;默认采用HTTP长轮询机制实现配…...

计算机毕业设计:Python出行数据智能分析与预测平台 Django框架 可视化 数据分析 PyEcharts 交通 深度学习(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ > &#x1f345;想要获取完整文章或者源码&#xff0c;或者代做&#xff0c;拉到文章底部即可与…...

3大优势!Scarab模组管理工具使用技巧:从新手到高手的进阶指南

3大优势&#xff01;Scarab模组管理工具使用技巧&#xff1a;从新手到高手的进阶指南 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否在安装空洞骑士模组时遇到过文件路…...

拓朋N86公网车载台:邮政分拣车高效协同的通信保障

在繁忙的邮政包裹分拣中心&#xff0c;效率与协同是每辆分拣车与调度人员最为关心的两大要素。在这样一片高速运转而充满挑战的天地里&#xff0c;拓朋N86公网集群车载台以其出色的性能&#xff0c;悄然成为了分拣车队的隐形指挥中枢。 全国覆盖&#xff0c;沟通无阻 分拣中心往…...

局域网聊天室终极解决方案:无需互联网的即时通讯工具

局域网聊天室终极解决方案&#xff1a;无需互联网的即时通讯工具 【免费下载链接】LAN-Chat-Room &#x1f609;基于QT开发的局域网聊天室 项目地址: https://gitcode.com/gh_mirrors/la/LAN-Chat-Room 在办公室、学校或家庭网络中&#xff0c;你是否曾遇到过需要快速分…...

用快马平台实践vibe coding:五分钟生成你的音乐心情可视化原型

今天想和大家分享一个特别有趣的小项目——用InsCode(快马)平台快速实现音乐心情可视化网页。这个项目的灵感来源于vibe coding理念&#xff0c;也就是通过编程直接表达当下的情绪和氛围。整个过程就像用代码画画一样直观&#xff0c;特别适合创意型开发者。 项目构思 我想要做…...

Unity VideoPlayer常见报错解析:First video frame not zero与Color Standard问题实战

1. 解析"First video frame not zero"报错 遇到Unity VideoPlayer报出"First video frame not zero"时&#xff0c;很多开发者会一头雾水。这个错误直译过来就是"第一帧视频不是从零开始的"&#xff0c;听起来有点抽象。我用个生活中的例子解释&…...