显式调用构造函数产生的悲剧

昨天一个同学让我帮他调试程序,发现一个诡异的问题,明明一个类的私有成员被赋值了,但运行时却总是不定的值。仔细检查了好久,才发现原来他把构造函数当作普通函数进行了显式调用,结果产生了悲剧。

    

将他的问题简单的抽象如下:

    

大家看看下面这段代码的输出结果是什么?这段代码有问题么?


#include <iostream>  class CTest  
{public:CTest()  {  m_a = 1;  }  CTest(int b)  {  m_b = b;  CTest();  }  ~CTest()  {}  void show  {  std::cout << m_a << std::endl;  std::cout << m_b << std::endl;  }  private:  int m_a;  int m_b;  
}; void main()  
{  CTest myTest(2);  myTest.show();  
}


-----------------------------------------------------------
【分析】
-----------------------------------------------------------


输出结果中,m_a是一个不确定的值,因为没有被赋初值,m_b 为2


注意下面这段代码


CTest(int b)
{m_b = b;CTest();
}


在调用CTest()函数时,实际上是创建了一个匿名的临时CTest类对象,CTest()中赋值 m_a = 1 也是对该匿名对象赋值,故我们定义的myTest的m_a其实没有被赋值。说白了,其实构造函数并不像普通函数那样进行一段处理,而是创建了一个对象,并且对该对象赋初值,所以显式调用构造函数无法实现给私有成员赋值的目的。


这个例子告诉我们以后代码中千万不要出现使用一个构造函数显式调用另外一个构造函数,这样会出现不确定性。其实一些初始化的代码可以写在一个单独的init函数中,然后每一个构造函数都调用一下该初始化函数就行了。

在此,顺便再提出另外一个问题以供思考:


CTest *p = NULL;  void func()  {  p = new CTest();  }

    

代码右边显示调用CTest(),是否依然会产生一个匿名的临时对象a,然后将该匿名的临时对象a的地址赋给指针p? 如果是这样的话,出了func函数后,临时对象a是否会被析构? 那指针p不成为了野指针了?你能解释这个问题么?

     

关于c++构造函数的详细分类与示例在《C++构造函数详解》一文中有详细的描述,有兴趣的读者可以看看:http://ticktick.blog.51cto.com/823160/194307


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

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

相关文章

input输入框修改后自动跳到最后一个字符

<input class"m-form-control" onpaste"return false" placeholder"直播间名称" name"name" onkeyup"this.valuethis.value.replace(/[^\u4e00-\u9fa5|\u0000-\u00ff|\u3002|\uFF1F|\uFF01|\uff0c|\u3001|\uff1b|\uff1a|\u300…

CCNA配置试验之七 PPP中PAP和CHAP的验证

PPP支持NCPC&#xff08;网络控制协议&#xff09;和LCP&#xff08;链路控制协议&#xff09;PPP的验证方式分为PAP二次握手明文传输和CHAP三次握手密文传输。试验配置PAP和CHAP的验证&#xff1a;试验配置如下&#xff1a;R1&#xff08;CHAP&#xff09;Router>enRouter#…

sql优化批量插入性能提升

建议批量插入 批量提交 INSERT into book VALUES(5,"A"),(6,"B");多条提交 INSERT into book VALUES(5,"A"); INSERT into book VALUES(6,"B") 理由 默认新增SQL有事务控制&#xff0c;导致每条都需要事务开启和事务提交&#xff0…

2017.10.13java上机出现中的问题

此篇博文主要说明在这次上机中遇见的问题和解决方法。 实验一&#xff1a;计算机计算组合数 问题1&#xff1a;在递推的方法用杨辉三角计算中&#xff0c;我创建了二维数组&#xff0c;但二维数组的行和列数并不是m&#xff0c;而是m1&#xff0c;因为杨辉三角的第一行只有一个…

重装系统

终于重装了系统&#xff0c;装了几个软件还比较满意 一个没有广告的迅雷qq终于可以打开网页了完美解码可以硬解转载于:https://www.cnblogs.com/jetz/archive/2010/04/18/1714847.html

sql优化索引不宜建太多,一般5个以内

索引不宜太多&#xff0c;一般5个以内 索引并不是越多越好&#xff0c;虽其提高了查询的效率&#xff0c;但却会降低插入和更新的效率&#xff1b;索引可以理解为一个就是一张表&#xff0c;其可以存储数据&#xff0c;其数据就要占空间&#xff1b;索引表的数据是排序的&…

Unity3D学习(五):实现一个简单的视觉感知

前言 在很多第一人称或者第三人称射击游戏的单人模式中&#xff0c;玩家的乐趣往往来源于和各式各样的AI敌人的战斗。而战斗的爆发很多时候是因为这些AI在“看见”玩家后就会立即做出反应&#xff0c;比如开火、呼叫同伴、躲藏或者逃跑等。 所以这些AI到底是如何探测&#xff0…

BeanFactory中String FACTORY_BEAN_PREFIX = ““;解析

此接口定义了Bean的一些基本信息判断和获取bean比如 isSingleton isTypeMatch 还有一个需要注意的地方&#xff0c;看这个常量: String FACTORY_BEAN_PREFIX "&"; 如果我们在获取Bean的时候&#xff0c;使用&则获取的是FactoryBean本身对象&#xff0c;否则…

.NET Core简介

转载于:https://www.cnblogs.com/wxc-kingsley/p/7660878.html

Mysql数据库的瓶颈处理一点建议

Mysql数据库的瓶颈处理一点建议我们在使用Mysql数据库是常见的两个瓶颈是CPU和I/O的瓶颈&#xff0c;CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候。磁盘I/O瓶颈的出现呢发生在装入数据远大于内存容量的时候&#xff0c;如果应用分布在网络上&#xff0c;那么…

spring中DefaultListableBeanFactory是bean加载的核心部分,是spring注册和加载bean的默认实现方式

DefaultListableBeanFactory介绍 BeanFactory是个Factory&#xff0c;也就是IOC容器或对象工厂&#xff0c;而DefaultListableBeanFactory是Bean工厂的一个默认实现&#xff0c;DefaultListableBeanFactory提供了原始的BeanFactory的功能&#xff0c;如&#xff1a;对外提供ge…

使用MyBatis集成阿里巴巴druid连接池(不使用spring)

在工作中发现mybatis默认的连接池POOLED&#xff0c;运行时间长了会报莫名其妙的连接失败错误。因此采用阿里巴巴的Druid数据源&#xff08;码云链接 &#xff0c;中文文档链接&#xff09;。 mybatis更多数据源参考博客链接 。 1 环境 eclipse mars2 maven3.3.9 mysql5.7 2 …

捣鼓了一个月的SharePoint

从7月底到现在&#xff0c;对SharePoint有了比较大概的理解。除了文档管理、搜索功能&#xff0c;它的整合能力很强。由于我们缺少人手、理解有限&#xff0c;有没有这方面的专家愿意兼职有关SharePoint开发&#xff1f;请联系 towangjinshenghotmail.com私事&#xff1a;由于我…

docker search从Docker Hub查找(搜索)镜像

镜像搜索 docker search 名称 列表说明&#xff1a;NAME&#xff1a;镜像名(镜像仓库源的名称)DESCRIPTION&#xff1a;对该镜像的描述STARS&#xff1a;类似 Github 里面的 star&#xff0c;表示点赞、喜欢的意思OFFICIAL&#xff1a;是否 docker 官方发布AUTOMATED&#xff1…

微信js-sdk使用

var getAppidfunction(){$.ajax({url: "http://bos.foreverlynn.com/weixin/getWXUrl",dataType: "jsonp",data: {url: window.location.href},success: function (res) {if (res.code ! 200) {}wx.config({debug: false, // 开启调试模式,调用的所有api的…

***清除工具的进化

想就***清除工具的革新换代说说&#xff0c;算抛砖引玉吧&#xff0c;对付***这些东西&#xff0c;不会有穷尽的那一天&#xff0c;清除工具革新是围绕病毒***更新展开的&#xff0c;未来肯定还会有更好地清 除思路。一切为了用户的电脑更安全&#xff0c;让清除***的过程变得更…

Codeforces Round #441 D. Sorting the Coins(模拟)

http://codeforces.com/contest/876/problem/D 题意&#xff1a;题意真是难懂&#xff0c;就是给一串序列&#xff0c;第i次操作会在p[x]&#xff08;1<x<i&#xff09;这些位置放上硬币&#xff0c;然后从左到右观察&#xff0c;如果第i个位置有硬币但第i1个位置没有硬币…

Oracle 数据库实例启动关闭过程

-- -->Oracle 数据库实例启动关闭过程 -- /* Oracle数据库实例的启动&#xff0c;严格来说应该是实例的启动&#xff0c;数据库仅仅是在实例启动后进行装载。Oracle数据启动的过程被划分为 几个不同的步骤&#xff0c;在不同的启动过程中&#xff0c;我们可以对其实现不同的…

mysql求差集

mysql怎么求差集? mysql如何查询两个字段数不同的表中数据不一致的记录 一般可用NOT EXISTS&#xff08;非存在子句&#xff09;或 LEFT JOIN左&#xff08;右&#xff09;连接后所产生空字段值来筛选两表的差集 classinfo表 student表 1、NOT EXISTS not exists在比对字段…

C#判断字符串是否为数字字符串

在进行C#编程时候&#xff0c;有的时候我们需要判断一个字符串是否是数字字符串&#xff0c;我们可以通过以下两种方法来实现。 【方法一】&#xff1a;使用 try{} catch{} 语句。 我们可以在try语句块中试图将string类型的字符串变量转换为int类型&#xff0c;如果该字符…