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

拷贝构造函数

1. 拷贝构造函数是构造函数的一个重载形式。

2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错, 因为会引发无穷递归调用。

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}// Date(const Date& d)   // 正确写法Date(const Date d)   // 错误写法:编译报错,会引发无穷递归{_year = d._year;_month = d._month;_day = d._day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2(d1);return 0;
}

3. 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

class Time
{
public:Time(){_hour = 1;_minute = 1;_second = 1;}Time(const Time& t)//自定义类型拷贝构造需要自己写{_hour = t._hour;_minute = t._minute;_second = t._second;cout << "Time::Time(const Time&)" << endl;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:// 基本类型(内置类型)int _year = 1970;int _month = 1;int _day = 1;// 自定义类型Time _t;
};
int main()
{Date d1;// 用已经存在的d1拷贝构造d2,此处会调用Date类的拷贝构造函数// 但Date类并没有显式定义拷贝构造函数,则编译器会给Date类生成一个默认的拷贝构造函数Date d2(d1);return 0;
}

在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。

4. 编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,还需要自己显式实现吗? 当然像日期类这样的类是没必要的。那么下面的类呢?验证一下试试?

typedef int DataType;
class Stack
{
public:Stack(size_t capacity = 10){_array = (DataType*)malloc(capacity * sizeof(DataType));if (nullptr == _array){perror("malloc申请空间失败");return;}_size = 0;_capacity = capacity;}void Push(const DataType& data){// CheckCapacity();_array[_size] = data;_size++;}~Stack(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}
private:DataType *_array;size_t _size;size_t _capacity;
};
int main()
{Stack s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);Stack s2(s1);return 0;
}

 类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请 时,则拷贝构造函数是一定要写的,否则就是浅拷贝。

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

相关文章:

  • 数据库: MySQL安装部署、主从
  • Java IO流(二)IO模型(BIO|NIO|AIO)
  • java版本spring cloud 企业工程系统管理 工程项目管理系统源码em
  • 飞天使-k8s简单搭建
  • java中把一个list转tree的方法
  • QT设置widget背景图片
  • 【ROS】话题通信--从理论介绍到模型实现(C++)
  • 服务器数据恢复-EqualLogic存储RAID5数据恢复案例
  • qsort函数详解
  • C#学习,委托,事件,泛型,匿名方法
  • 2023最新版本~KEIL5使用C++开发STM32
  • 汽车领域专业术语
  • H3C交换机如何配置本地端口镜像并在PC上使用Wireshake抓包
  • 零基础自学:2023 年的今天,请谨慎进入网络安全行业
  • 向gitee推送代码
  • 双指针算法实例1(移动零)
  • C#程序随系统启动例子 - 开源研究系列文章
  • 最全攻略之人工智能顶会论文发表
  • Redis基于内存的key-value结构化NOSQL(非关系型)数据库
  • Spring学习笔记+SpringMvc+SpringBoot学习笔记
  • 如何在 3Ds Max 中准确地将参考图像调整为正确的尺寸?
  • 集简云推出的全国第一款 AI+连接器解决方案产品语聚AI
  • git错误记录
  • linux使用jmeter进行压测
  • leetcode 139. 单词拆分
  • 若依的使用(token补充、HTTPS(网络安全)、分页前后端配置)
  • Java源码分析(一)Integer
  • WebRTC音视频通话-WebRTC视频自定义RTCVideoCapturer相机
  • 【基于鲲鹏及openEuler20.03TLS下MySQL8.0.17性能调优】
  • GRPC 学习记录