向各位老大请教一个类初始化的问题。为啥不掉用我的拷贝构造函数呢。谢谢。

yakeezhao yakeezhao 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
下面代码的代码,在VC6及VC2008上测试(我这里只有VC这一种编译器), 结果很奇怪,请各位老大不吝赐教。多谢多谢。

#include <iostream>
using namespace std;
class mystring
{
public:
mystring(char* p = NULL)
{
cout << "mystring(char*) = " << (NULL != p ? p : "NULL") << endl;
if(NULL == p)
{
m_pdata = new char[1];
*m_pdata = 0;
}
else
{
int ilen = strlen(p);
m_pdata = new char[ilen + 1];
strcpy(m_pdata, p);
}
}
~mystring()
{
if(NULL != m_pdata)
{
delete []m_pdata;
m_pdata = NULL;
}
}
mystring(const mystring& obj)
{
cout << "mystring(mystring&) = " << obj.m_pdata << endl;
mystring(obj.m_pdata);
}
const mystring& operator = (const mystring& rhs)
{
cout << "mystring operator = " << rhs.m_pdata << endl;
mystring(rhs.m_pdata);
return *this;
}
public:
char* m_pdata;
};
class mybase
{
public:
virtual ~mybase(){};
mybase() : m_sf8("base")
{
cout << "myfunc8_base : default constructor is necessary in parent class" << endl;
m_sf82 = "base2";
}
private:
mystring m_sf8;
mystring m_sf82;
};
class myderived : public mybase
{
public:
myderived(mystring& sf8) : m_sf8(sf8)
{
cout << "myderived : myderived(mystring&) : m_sf8 = " << m_sf8.m_pdata << endl;
}
private:
const mystring& m_sf8;
};
int main(int argc, char* argv[])
{
mystring ms81("1");
myderived m8d2(ms81);
return 0;
}

运行结果为:
1 -- mystring(char*) = 1
2 -- mystring(char*) = base
3 -- mystring(char*) = NULL
4 -- myfunc8_base : default constructor is necessary in parent class
5 -- mystring(char*) = base2
6 -- mystring operator = base2
7 -- mystring(char*) = base2
8 -- myderived : myderived(mystring&) : m_sf8 = 1

请教:
第 3 行 “mystring(char*) = NULL”是由哪句代码触发的呢?
第 5 行 “mystring(char*) = base2”又是由哪句代码导致的呢?
我觉得那两行结果不该出现啊。倒是代码 ‘myderived(mystring& sf8) : m_sf8(sf8)‘,我觉得应该触发mystring的拷贝构造函数 ’mystring(const mystring& obj)‘,可是这句却没出现。这是怎么一会事啊?类的初始化还真的很晕啊。谢谢各位了。
...全文

相关推荐

C++右值引用与移动语义:从深拷贝性能瓶颈到现代高效编程

在C++编程中,深拷贝带来的性能开销是处理容器和复杂类时常见的瓶颈,尤其是在涉及动态内存管理和大数据传递的场景。为了解决这一问题,C++11引入了右值引用和移动语义,它们通过资源所有权的转移而非复制来提升效率。右值引用允许绑定到临时对象,移动构造函数和移动赋值运算符则实现了资源的“窃取”,从而避免了不必要的拷贝。这一机制不仅优化了函数返回值传递和容器操作,还为智能指针和字符串类等资源管理组件带来了显著的性能提升。通过理解左值、右值和将亡值的概念,开发者可以更好地利用移动语义,编写出更高效的现代C++代码。本

weixin_33888907

《Effective C++》核心思想与实践指南:从资源管理到现代C++编程

在C++编程中,资源管理和对象生命周期控制是构建健壮、高效软件的核心基础。其背后的关键原理是RAII(Resource Acquisition Is Initialization),它通过对象的构造与析构自动管理资源(如内存、文件句柄),从而从根本上避免资源泄漏。这一思想直接催生了现代C++中智能指针(如std::unique_ptr和std::shared_ptr)的广泛应用,它们通过自动化内存管理,显著提升了代码的安全性与可维护性。理解编译器默默生成的函数(如拷贝控制成员)和正确设计类的拷贝、移动语义,

weixin_33882452

C++ JSON处理实战:jsoncpp集成、中文乱码解决与性能优化

在C++开发中,处理JSON数据是常见的需求,尤其在网络通信、配置文件解析和数据序列化等场景。JSON作为一种轻量级的数据交换格式,其核心在于提供一种标准化的文本表示方法,用于存储和传输结构化数据。C++标准库未内置JSON支持,因此开发者需要借助第三方库来实现高效、可靠的解析与生成。jsoncpp作为一款历史悠久、API简洁且跨平台兼容性强的库,成为了许多项目的首选。它通过Json::Value类统一表示JSON的各种数据类型,并提供了直观的构建、解析和序列化接口。在实际工程应用中,正确处理字符编码(特别

weixin_33863087

C++进阶四件套:数组、指针、结构体与枚举的实战解析

C++编程中,数组、指针、结构体与枚举构成了从基础语法到工程实践的核心链路。数组负责连续内存的数据管理,指针提供间接访问内存的能力,结构体将不同类型数据组织为整体,枚举则用可读名称替代魔法数字。理解这些概念背后的内存模型与编译原理,是掌握C++进阶特性(如智能指针、内存对齐)的关键。在实际应用中,无论是网络数据包解析、学生管理系统,还是游戏引擎开发,都能看到这四者的紧密配合。本文以工程实践为导向,剖析常见误区和性能陷阱,帮助你安全高效地使用数组、指针、结构体与枚举,并规避越界、空指针、内存对齐不一致等经典问

weixin_34389926

【工业自动化】欧姆龙PLC产品线与编程软件应用:从选型架构到调试排错的全流程技术指南

内容概要:本文《欧姆龙PLC与编程软件完全手册》系统介绍了欧姆龙PLC的产品架构、软件体系、通信协议、选型策略及编程调试技巧。重点区分了两大技术平台:基于CX-Programmer的传统C系列(CP/CJ/CS)与基于Sysmac Studio的新一代Sysmac平台(NJ/NX/NY),强调二者在软件生态、寻址方式和通信架构上的根本差异。手册详细对比了各系列PLC的性能参数,并提供与西门子产品的功能对标,帮助用户快速定位。深入讲解了编程操作中的关键问题,如任务结构设计、间接寻址、FB封装陷阱、在线调试五件套等,特别指出“FB使能关闭时状态不初始化”等易出错点。最后汇总了选型路径与现场避坑清单,极具实战指导价值。; 适合人群:具备一定工业自动化基础,从事PLC编程、设备调试、系统集成的研发工程师和技术人员,尤其是从西门子平台转向欧姆龙或参与新项目选型的1-5年经验从业者。; 使用场景及目标:① 新项目选型时判断应选用C系列还是Sysmac平台;② 编程调试过程中掌握高效操作技巧与常见问题排查方法;③ 实现跨平台迁移、系统升级或接手他人项目时规避架构与逻辑陷阱;④ 提升对欧姆龙PLC任务机制、间接寻址、FB设计等高级功能的理解与应用能力。; 阅读建议:本手册理论结合实践,建议按“先架构后操作”的顺序阅读,重点章节需结合实际工程反复演练。特别是FB设计规范、任务切换处理、强制操作收尾流程等内容,应在仿真环境中验证后再应用于现场。注意版本匹配问题,操作前确认所用软件与控制器固件版本兼容。

莫问西东LJ
评论 13
收藏 已收藏
分享
返回顶部
yakeezhao
C++ 语言 65,214 成员 250,514 内容