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

C++拷贝构造函数与运算符重载应该注意的一个问题?

看下面的例子:

class TestClass {
public:char* _pdata;size_t _nLength;public:TestClass(const TestClass& other) {_nLength = other._nLength;_pdata = new char[_nLength];memcpy((void*)_pdata,other._pdata, _nLength + 1);}TestClass(const char* pstr) {delete[] _pdata;_nLength = strlen(pstr);_pdata = new char[_nLength];memcpy((void*)_pdata, pstr, _nLength + 1);}
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);TestClass str = "abc";	 std::cout << str._pdata << "\n"; return a.exec();
}

运行结果:

但是,下面写法是充许的:

TestClass str = str = "abc";

因此,在拷贝构造函数该加上一句:

现在运行结果:

同理,在运算重载上,也一定要加上 if (this != &other)

另一个问题,在添加数据时一定要先拷贝旧数据,再添加新数据,然后再删除旧数据。

错误:

TestClass(const char* pstr) {
    delete[] _pdata;
    _nLength = strlen(pstr);
    _pdata = new char[_nLength];
    memcpy((void*)_pdata, pstr, _nLength + 1);
}
 

例如:

TestClass str = "abc123";

str = str._pdata;

或 str = str._pdata + 3;  //添加123

当pstr指向的数据与TestClass._pdata指向同一段内存时,上面例子的代码就有问题?

http://www.lryc.cn/news/534092.html

相关文章:

  • [7] 游戏机项目说明
  • “深入浅出”系列之C++:(20)C++17
  • .net一些知识点5
  • (七)QT——消息事件机制&绘图&文件
  • 【虚幻引擎UE】AOI算法介绍与实现案例
  • python学opencv|读取图像(六十)先后使用cv2.erode()函数和cv2.dilate()函数实现图像处理
  • AI能帮谷歌SEO做什么?
  • SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现
  • 【机器学习】数据预处理之数据归一化
  • 【专题】2024-2025人工智能代理深度剖析:GenAI 前沿、LangChain 现状及演进影响与发展趋势报告汇总PDF洞察(附原数据表)
  • 非递减子序列(力扣491)
  • 网站快速收录策略:提升爬虫抓取效率
  • 系统思考—自我超越
  • 苍穹外卖-菜品分页查询
  • 子集II(力扣90)
  • user、assistant、system三大角色在大语言模型中的作用(通俗解释)
  • LeetCode 3444.使数组包含目标值倍数的最小增量
  • 2月9日星期日今日早报简报微语报早读
  • MOSSE目标跟踪算法详解
  • 生成式聊天机器人 -- 基于Pytorch + Global Attention + 双向 GRU 实现的SeqToSeq模型 -- 下
  • 本地部署的DeepSeek-R1-32B与DeepSeek-R1-7B模型效果对比
  • AWS Fargate
  • 表单与交互:HTML表单标签全面解析
  • 【电机控制器】STC8H1K芯片——低功耗
  • win10 llamafactory模型微调相关① || Ollama运行微调模型
  • SMU寒假训练周报
  • 高并发读多写少场景下的高效键查询与顺序统计的方案思路
  • Android Studio 配置 Gerrit Code Review
  • html为<td>添加标注文本
  • (done) openMP学习 (Day10: Tasks 原语)