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

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

 

 

#include <stdlib.h>

#include <iostream>

using namespace std;

 

struct CLS

{

int m_i;

CLS( int i ) : m_i(i){}

CLS()

{

CLS(1);

}

};

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);

}

};

 

 

 

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

FFmpeg魔改指南:让RTMP协议完美兼容H265的三种方法(含SRS适配技巧) 本文详细介绍了三种让RTMP协议兼容H265编码的FFmpeg魔改方案,包括基于官方补丁的标准改造、Intel的SVT-HEVC集成方案以及金山云的自定义扩展方案。文章重点解析了各方案的实现原理与适配技巧,并提供了在SRS 6.0服务器上进行深度配置和性能调优的完整实战指南,帮助开发者解决H265推流至传统RTMP服务器的兼容性问题。 阅读详情

相关推荐

从虚拟机到双系统:手把手教你为Gromacs搭建最强Linux环境(含WSL2、Ubuntu22.04配置)

本文详细指导如何在Windows系统下为Gromacs分子动力学模拟搭建高性能Linux环境,涵盖WSL2和Ubuntu22.04双系统配置。通过对比虚拟机、WSL2和原生Linux的性能数据,提供GPU加速、内存优化等实用技巧,帮助科研人员提升计算效率。

weixin_30861797的博客 270

C++——构造函数(定义以及调用构造函数的过程)

构造的特殊的成员函数,函数名和类名相同,无返回类型,可以带参数(说明构造函数可以重载)

x20020402的博客 5867

保姆级教程:用MATLAB搞定运动模糊图片修复(附完整代码与避坑指南)

本文提供了一份详细的MATLAB运动模糊图片修复教程,涵盖盲复原、图像复原等核心技术。通过傅里叶变换和Radon变换分析模糊参数,对比逆滤波、维纳滤波和Lucy-Richardson算法效果,并附完整代码与避坑指南,帮助用户实现专业级图像处理。

weixin_26765363的博客 229

C++构造函数的三种调用方法

C++构造函数的三种调用方法 1、拷贝参数传递, void test01() { Point p = Point(2, 3); cout << "p.x=" << p.x << endl; cout << "p.y=" << p.y << endl; cout << "p.地址:" << (in...

Hareliong的博客 4627

Abaqus子程序开发避坑指南:从UMESHMOTION到齿轮磨损分析实战

本文深入探讨Abaqus子程序开发中的关键技术与避坑指南,重点解析UMESHMOTION在齿轮磨损分析中的实战应用。从开发环境搭建、调试框架构建到性能优化和大规模计算,提供系统化的解决方案。通过真实案例展示如何避免内存泄漏、网格畸变等常见问题,并介绍数据驱动的磨损预测等前沿技术,帮助工程师提升仿真精度与效率。

weixin_30892037的博客 88

TEC 高精度控温算法:实现精准升降温与恒温控制

本文深入解析了TEC高精度控温算法的核心原理与工程实践。针对TEC非线性、时变的特性,算法通过智能状态机实现精准升降温与恒温控制,并详细阐述了参数整定、硬件协同及调试优化的系统性方法,为半导体激光器、PCR仪等高精度温控应用提供了一套完整的解决方案。

weixin_29212867的博客 1012

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

简介:C++的构造函数用于对象的初始化,然后将初始化之后的对象赋值给一个变量。下面将要介绍调用类构造函数的几种方法。

weixin_44992737的博客 1254

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

weixin_42162924的博客 34

c++ 拷贝构造函数_C++构造函数总结

最近在找工作,比较忙,所以没有时间写文章了。找了一段时间了,还是没有什么收获。找工作给我一个最大的体会就是"基础要扎实,代码能力要强(这里的代码不是指那种业务逻辑的代码哦)"。01 文章概要 这篇文章总结一下C++中的构造函数,然后自己实现一个MyString类,实现对MyString字符串的输入和输出。如果对C++熟悉的童鞋应该就能猜到后面要介绍的知识了: C++的构造函数(分的细就是6种,粗一...

weixin_39894473的博客 344

使用C/C++复制图像

要使用上述代码,需要将输入图像和输出图像的文件名替换为实际的图像文件名。当程序执行完毕后,将会在当前目录下生成一个名为"output.jpg"的图像文件,其中包含与输入图像完全相同的图像数据。要使用上述代码,需要将输入图像和输出图像的文件名替换为实际的图像文件名。当程序执行完毕后,将会在当前目录下生成一个名为"output.jpg"的图像文件,其中包含与输入图像完全相同的图像数据。函数将输出图像保存到文件中。在这个示例中,我们假设输入图像是一个常见的JPEG图像,文件名为"input.jpg"。

CyberWarpX的博客 729

SAP_SD模块更改销售订单定价简介

方式优点缺点适用场景MASS简单,无需开发不能触发重新定价逻辑修改特定字段BDC (VA02)可模拟人工操作维护复杂,速度慢少量订单批改稳定、安全需ABAP支持推荐用于批量重新定价VBOF标准重算返利仅适返利类条件返利更新通过本文,我们了解了 SAP 的[SAP_SD模块更改销售订单定价]的基本概念和应用方法。希望这些信息能帮助您在实际工作中更好地使用 SAP 系统,提高工作效率和管理水平。更多SAP文章请点击更多SAP文章更新,大家一起学习进步!!!

我小时候很黑的博客 712

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

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

hhyer的博客 6359

Dify搭建AI测试用例生成器

1、获取产品需求文档2、解读、分析、挖掘需求点,提炼为测试点3、依据测试点,生成详细的测试用例4、输出测试用例1、打开 Dify 控制台,依次点击【工作室】-【ChatFlow】-【创建空白应用】。

十二测试录 1371

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

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

purerain的专栏 2478

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++构造函数调用顺序

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

innovation的博客 8632

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

奋斗,永不止步 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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
上一篇: 什么是敏捷软件开发
下一篇: Boost和STL学习资料大全
K行天下
博客等级 码龄19年 358粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值