c++构造函数再调用构造函数

C++类中一个构造函数调用另一个构造函数 class A { int a; int b; int c; public: A(int aa, int bb): a(aa), b(bb), c(0) {cout << "aa bb"<<endl;} A(int aa, int bb, int cc) virtual ~A(){} void print(int aa, int bb, int cc) { cout 阅读详情
题目如下:问下列代码的打印结果为0吗?

#include <stdlib.h>
#include 
<iostream>
using namespace std;

struct CLS
{
    
int m_i;
    CLS( 
int i ) : m_i(i){}
    CLS()
    {
        CLS(
0);
    }
};
int main()
{
    CLS obj;
    cout 
<< obj.m_i << endl;

    system(
"PAUSE");
    
return 0;
}
打印结果是不定的,不一定为0

代码奇怪的地方在于构造函数中调用了自己的另一个构造函数

我们知道,当定义一个对象时,会按顺序做2件事情:
1)分配好内存(非静态数据成员是未初始化的)
2)调用构造函数(构造函数的本意就是初始化非静态数据成员)

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

从这里,我们归纳如下:
1)在c++里,由于构造函数允许有默认参数,使得这种构造函数调用构造函数来重用代码的需求大为减少
2)如果仅仅为了一个构造函数重用另一个构造函数的代码,那么完全可以把构造函数中的公共部分抽取出来定义一个成员函数(推荐为private),然后在每个需要这个代码的构造函数中调用该函数即可
3)偶尔我们还是希望在类的构造函数里调用另一个构造函数,可以按下面方式做:
在构造函数里调用另一个构造函数的关键是让第二个构造函数在第一次分配好的内存上执行,而不是分配新的内存,这个可以用标准库的placement new做到:

    先看看标准库中placement new的定义

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

可见没有分配新的内存。

正确的方式:

struct CLS
{
    
int m_i;
    CLS( 
int i ) : m_i(i){}
    CLS()
    {
        
new (this)CLS(0);
    }
};

 


另: 若构造函数调用自身,则会出现无限递归调用,是不允许的

C++构造函数调用其他构造函数     学了这么久的C++,今天算是郁闷了!在此记下,防止以后犯错误!       在写一个string类的时候我在这个类的一个构造函数中去调用了其他的构造函数,代码如下:DBString::DBString(const DBString& srcStr){ DBString(srcStr.GetBuf());}     我为什么要这么写主要是有这么一个构造 阅读详情

相关推荐

软考中级信息系统监理师(第二版)-第21章基础设施工程监理

由于网络信息技术的飞速发展,变化日新月异,网络设计不但要保证目前网络传输容量的要求,也要考虑今后网络的发展,满足当前以及今后相当一段时间内的网络需求,便于向新技术的升级和衔接,同时又需要保护原有的投资。通用布缆系统工程中,承建单位的竣工文档主要包括以下内容:承建合同,招标文件,投标文件,设计方案,工程实施组织设计方案,工程施工报告,隐蔽工程记录,变更记录,自测报告,信息点分布图(表),园区、楼宇、水平配线表,楼层平面图及无线设备点位图,无线设备信息表,竣工图纸等。多排安装时,列间距不应小于1200mm。

2301_78583973的博客 1402

从一道题谈C++中构造函数调用构造函数

题目如下:问下列代码的打印结果为0吗? #include &lt;stdlib.h&gt; #include &lt;iostream&gt; using namespace std; struct CLS {     int m_i;     CLS( int i ) : m_i(i){}     CLS()     {         CLS(0);     } ...

weixin_34355881的博客 861

基于PLC的茶叶揉捻机自动控制系统设计【附代码】

茶叶揉捻是初茶加工过程中的一道关键工序,通过揉捻可以使鲜茶叶成条、碎茶及叶组织细胞破损等。影响茶叶成条率、碎茶率和叶组织细胞破损的主要因素包括揉捻时间、压力和揉捻桶转速。为了提高茶叶品质的稳定性和减轻工人的劳动强度,本文提出了一种基于PLC自动控制技术的茶叶揉捻机控制系统设计。📊 PLC自动化设计 | 毕业设计指导 | 工业自动化解决方案。✅ 具体问题可以私信或查看文章底部二维码。✅ 感恩科研路上每一位志同道合的伙伴!

lagougongzuoshi的博客 1344

C++学习笔记-----在一个构造函数中调用另一个构造函数

在构造函数中调用另一个构造函数如果一不注意就会有无限递归的危险,而且构造函数的参数的不同也决定了调用的不同,所以特意总结了一下哪些形式的调用时允许的: 首先假设构造函数调用时参数都是外部的变量,而不是一个常量。 第一种,也是C++11支持的一种调用方式。在函数的初始化列表中调用另一个构造函数: int b = 2; class Test { public: Test() : Test(b)

一个程序渣渣的小后院 1万+

【AI基础学习系列】二十一、一文搞懂GPT

本文系统介绍了GPT(Generative Pre-trained Transformer)模型的核心内容。首先阐述了GPT的本质是基于Transformer的预训练语言模型,其创新在于使用单向Transformer编码器。其次详细解析了GPT架构,包括输入层的Tokenization和Embedding处理、Transformer解码器堆叠的核心组件(自注意力机制、前馈神经网络等)以及预训练和微调两阶段训练过程。接着说明了GPT的工作原理:通过无监督预训练学习语言统计规律,再结合有监督微调适应具体任务。

ASH_GUARDIAN的博客 1689

SpringBoot Redis入门(一)——redis、Lettuce、Redisson使用

Lettuce是SpringBoot自带的Redis客户端,性能比Redis要好, 是线程安全的,支持同步编程,异步编程,响应式编程,自动重新连接,主从模式,集群模块,哨兵模式Redisson 是一个在 Redis 的功能基础上实现的 Java 驻内存数据网格客户端。实现了分布式和可扩展的 Java 数据结构,提供很多分布式相关操作服务,例如分布式锁,分布式集合,可通过 Redis 支持延迟队列。

朗朗的博客 3836

C++ 之委托构造函数& new(this)的运用

struct Rect{ Rect(){ new(this) Rect(1, 2, 3, 4, 5, 6); // left =1; // top =2; cout <<"left second:" << left <<endl; } Rect(int l, int t, int r, ...

nuoshueihe的专栏 2337

Ansys Zemax与Speos协同设计:HUD系统从光学优化到驾驶模拟的全流程解析

本文详细解析了如何利用Ansys Zemax与Speos这对“黄金搭档”进行HUD系统的协同设计。流程始于Zemax进行核心光学架构与像差优化,奠定性能基础;随后将设计无缝导入Speos,通过HUD光学分析模块进行量化验证;最终在虚拟驾驶环境中进行沉浸式模拟,评估实际视觉体验与系统集成效果,实现从光学优化到驾驶模拟的全流程闭环。

weixin_29201933的博客 274

C++中构造函数调用构造函数

最近在整理C++知识的时候,突然想到如何在C++中实现构造函数调用构造函数的问题,常见的错误是按照如下方式来调用: 1: #include 3: class Test 4: { 5: public: 6: int m_a; 8: Test(int a) 9: { 10: m_a = a; 1...

weixin_30654583的博客 395

一篇文章带你搞定数学建模里的主成分分析(05年水质问题示例应用讲解含代码)

文章目录一、题目分析二、原理公式三、MATLAB实现某一地区的主成分分析四、MATLAB 实现所有地区28个月的综合分析五、注意 一、题目分析 对长江近两年多的水质情况做出定量的综合评价,并分析各地区水质的污染状况 考虑到各指标之间可能存在一定的相关性,选用主成分分析法对长江流域主要城市水质检测报告进行分析,选取主成分,并把主成分得分按照方差贡献率加权求和,得到每个地区的污染综合评价指数,进而可以计算每个月长江流域的污染综合评价指数,对平均综合评价指数进行排序 二、原理公式 根据主成分分析的方法,分析长江沿

南淮北安的博客 2625

带有HSE组件的S32系列芯片中各子系统如何依次启动?

仔细阐述了上电后各个子系统的启动顺序,并给出了详细的启动步骤流程图。

车载系统攻城狮 1704

c++中构造函数的调用顺序

c++中构造函数的调用顺序 C++中调用构造函数按照如下顺序: 一:先调用虚拟基类的构造函数。并且按照它们的被继承的顺序进行构造。 二:调用非虚拟基类的构造函数,也是按照它们被继承的顺序构造。 三:调用类中成员对象的构造函数,按照声明顺序调用。 四:最后调用自己的构造函数。 举例: 对于如下代码: #include <iostream> using namespace std; class B1 { public: B1(int i) { cout&lt

hhyer的博客 6361

深度强化学习训练结果曲线绘制教程

使用python语言,只调用matplotlib库,绘制训练过程中保存的强化学习训练曲线。模仿经典论文中的训练曲线,多次训练取平均,并绘制出阴影区域。

加斯顿工程师的博客 913

看C++中构造函数的调用顺序

C++构造函数的调用顺序 构造函数的执行次序如下: 1,调用基类构造函数,调用顺序按照他们的继承时声明的顺序。 2,调用内嵌成员对象的构造函数,调用顺序按照他们在类中声明的 顺序。 3,派生类的构造函数体中的内容。 析构函数的调用顺序相反。 看下面的程序 #includea#includeusing namespace std; class point{pu

purerain的专栏 2478

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++构造函数调用顺序

C++构造函数按下列顺序被调用: (1)任何虚拟基类的构造函数按照它们被继承的顺序构造; (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造; (3)任何成员对象的构造函数按照它们声明的顺序调用; (4)类自己的构造函数。 #include <iostream> using namespace std; class OBJ1 { public: OBJ1(){ cout...

innovation的博客 8633

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

c++ 子类调用父类有参构造函数

(1)多态性 在C++或者Java中,多态性的最大好处,以我目前粗浅的理解,是减少代码量。子类越多,越明显。 (2)构造函数的调用 FatherClass *pt = new ChildClass; 父类指针-->子类实例 , 首先调用父类无参构造函数,然后调用子类构造函数。 (3)如果子类构造函数无参数,一切都好办。但是,往往子类构造函数需要参数。那么应该怎么办呢? 可以这么写:子

奋斗,永不止步 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++ 全局构造函数调用的顺序

C++ 全局构造的顺序

doon的专栏 4401

C++调用构造函数的方式

今天遇见了一个挺逗的问题,这个问题已经不是第一次绊脚了。放到这里,提醒自己的同时,也相信学习C++的朋友一定都会经历同样的问题。 还是老风格,先看代码: 1 class A 2 { 3 public: 4   A(int a) 5   { 6   } 7 }; 8 class B : public A 9 { 10 11 }; 12 ...

weixin_30778805的博客 768

C++中显式指定调用父类的构造函数

在C++语法中,派生类中的构造函数操作是一个重要知识点,构造函数是用来初始化对象的。 基类构造函数总是先于派生类构造函数被调用。因为基类是派生类的基础,所以必须先创建基类。如果不指定要使用的基类构造函数,编译器就安排调用默认的基类构造函数。 规则:创建对象时首先调用基类的构造函数,然后调用派生类的构造函数;而销毁对象时首先调用派生类的析构函数,然后调用基类的析构函数。 #pragma o...

僧静思深 5837

C++ 如何在构造函数中调用构造函数?

C++ 如何在类的构造函数中调用已经写好的构造函数 让我们先看一段代码: #include<iostream> using namespace std; int main() { int a = 12; cout << a << endl; int* p = new (&a) int(15); cout <<...

weixin_43406295的博客 3510

c++构造函数中调用构造函数

 本人不是很懂c++,只是平时仿真的时候,用一点,对于其一些约定就不是很熟,于是今天就栽在一个bug上了。  示例代码如下: #include &lt;iostream&gt; using namespace std; class Sender{ public: Sender(uint32_t number){ Sender(number,1000); } ...

u010643777的专栏 3509

C++复制构造函数和构造函数调用小困惑

最近看清华大学郑莉老师的C++课程,过C++的基础知识。遇到了一点小问题。 在进行类组合例子的调试中,有些不解的地方。先上代码。 #include "pch.h" #include <iostream> using namespace std; class Point { public: //外部接口 Point(int xx = 0, int yy = 0) { //构造函数 x = xx; y = yy; } Point(Point &p); //复制构

森四杨的博客 363
上一篇: 关于运算符重载(总结)
下一篇: malloc和new的区别
programerchen
博客等级 码龄15年 3粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值