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

c++ 拷贝构造函数

先测试下不显式定义拷贝构造函数,或拷贝构造函数声明为默认拷贝构造函数:

void testCopyConstructor() {class MyStr {private:char* str;int len;public:MyStr(const char* s = "") {len = strlen(s);str = new char[len + 1];strcpy_s(str, len + 1, s);}MyStr(const MyStr& other) = default; // 默认拷贝构造函数,或者去掉这句代码效果一样。// 析构函数会报错,因为调用拷贝构造函数后,另一个str和这个str地址相同,是同一个字符串,重复释放内存会报错!//~MyStr() { //delete[] str; // 释放数组//str = nullptr;//}void print() { cout << str << " len: " << len << " ,address of str: " << (void*)str<< " ,address of len: " << &len<< endl; }};MyStr s1 = "我是9527";MyStr s2 = s1; // 调用拷贝构造函数. 没有显示声明拷贝构造函数,会有默认的拷贝构造函数s1.print();s2.print();
}

打印:

可见,字符串这种指针类型数据其地址没变,还是原字符串,即浅拷贝。而int类型这种类型是值拷贝,地址变了。 析构函数被我注释了,此时调用析构函数会报错,因为str这个同一个字符串被重复释放内存了。

定义拷贝构造函数,代码:

void testCopyConstructor() {class MyStr {private:char* str;int len;public:MyStr(const char* s = "") {len = strlen(s);str = new char[len + 1];strcpy_s(str, len + 1, s);}// 拷贝构造函数(深拷贝)MyStr(const MyStr& other) {len = strlen(other.str);str = new char[len + 1];strcpy_s(str, len + 1, other.str);}~MyStr() { delete[] str; // 释放数组str = nullptr;}void print() { cout << str << " len: " << len << " ,address of str: " << (void*)str<< " ,address of len: " << &len<< endl; }};MyStr s1 = "我是9527";MyStr s2 = s1; // 调用拷贝构造函数. 没有显示声明拷贝构造函数,会有默认的拷贝构造函数s1.print();s2.print();
}

打印:

可见,拷贝构造函数中,将字符串也拷贝,比较俩个对象,字符串地址不一样,说明是深拷贝。调用析构函数也不报错了。ok

http://www.xdnf.cn/news/695701.html

相关文章:

  • JVM——Truffle:语言实现框架
  • 【机器学习基础】机器学习入门核心算法:朴素贝叶斯(Naive Bayes)
  • Spring AI 1.0 GA 深度解析:构建企业级AI应用的全栈实践指南
  • Linux的基本指令
  • vscode 终端 PATH 和python pip 不对
  • CSS (mask)实现服装动态换色:创意与技术的完美融合
  • HIS换代升级辅助脚手架:数据清洗、人员信息标准化、电子病历接口标准化、多模态影像接口标准化
  • 三级联动获取省市区
  • 8种常见数据结构及其特点简介
  • 排查Oracle文件打开数过多
  • JAVA 笔记
  • 【超详细教程】零基础本地部署DeepSeek-Coder-v2 16B!Ollama+GPU加速,100%跑通!
  • CCLINKIE转PROFINET:让执行器“丝滑”入网!
  • 脑机新手指南(一):BCILAB 脑机接口工具箱新手入门指南
  • 从新安全法到隐患判定标准:特种设备证件管理政策全梳理
  • vben-admin 2.8.0 版本修改 axios响应处理逻辑
  • MySQL:零基础入门(狂神版)
  • PyTorch安装Cuda版本选择
  • WMS系统选型与实施避坑手册
  • HarmonyOS 5 应用开发导读:从入门到实践
  • C++STL——map与set的使用
  • “顶点着色器”和“片元着色器”是先处理完所有顶点再统一进入片元阶段,还是一个顶点处理完就去跑它的片元?
  • 上传头像upload的简易方法,转base64调接口的
  • Spring AI 系列之使用 Spring AI 开发模型上下文协议(MCP)
  • maven编译时跳过test过程
  • MYSQL备份恢复知识:第六章:恢复原理
  • pythonocc hlr实例 deepwiki 显示隐藏线
  • Linux 系统入门篇四
  • SPEAR开源程序是用于逼真演示 AI 研究的模拟器
  • 【STM32】按键控制LED 光敏传感器控制蜂鸣器