【C++】拷贝构造函数及析构函数

2024-07-21 1213阅读

📢博客主页:https://blog.csdn.net/2301_779549673

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

📢本文由 JohnKi 原创,首发于 CSDN🙉

📢未来很长,值得我们全力奔赴更美好的生活✨

【C++】拷贝构造函数及析构函数

【C++】拷贝构造函数及析构函数

文章目录

  • 📢前言
  • 🏳️‍🌈什么是拷贝构造函数
    • ❤️1. 引用传参
    • 🧡2. 自动生成的拷贝构造函数
    • 🏳️‍🌈什么是析构函数
    • 👥总结

      📢前言

      当谈论C++编程语言的核心概念时,拷贝构造函数和析构函数无疑是不可或缺的话题。它们不仅仅是理解对象生命周期和内存管理的关键,更是构建复杂系统和高效程序的基础。拷贝构造函数在对象复制过程中扮演着关键角色,决定了如何正确地复制对象的状态和数据。而析构函数则负责在对象生命周期结束时释放资源,确保程序运行的稳定性和性能。

      在本博客系列中,我们将深入探讨C++中拷贝构造函数和析构函数的实现原理、使用场景以及最佳实践。我们将从基础知识入手,逐步扩展到高级应用和实际案例分析,帮助读者建立起对这两个重要概念的全面理解和应用能力。无论您是刚入门的初学者,还是希望深化专业知识的资深开发者,本系列都将为您提供有价值的内容和实用的技能,助力您在C++编程的道路上更进一步。让我们一起探索C++世界中的拷贝构造函数和析构函数,发现它们的力量和魅力!


      🏳️‍🌈什么是拷贝构造函数

      什么是拷贝构造函数

      如果已经存在一个对象,我想对这个对象再复制一份,该怎么做呢?

      有两种方法,拷贝构造和赋值运算符重载·,但显然赋值运算符重载不是这里的重点,这里要讲的是前者。至于后者笔者后续再补充。

      拷贝构造函数是类的六大特殊成员函数之一,它是构造函数的一个重载形式。

      而且由于拷贝并不需要改变参数,所以参数部分还要用 “const”来修饰。

      比如下面这样一个类

      #include
      using namespace std;
      class Date
      {
      public:
      	
      	Date(int year = 1, int month = 1, int day = 1)
      	{
      		_year = year;
      		_month = month;
      		_day = day;
      	}
      	void Print()
      	{
      		cout 
      		_year = d._year;
      		_month = d._month;
      		_day = d._day;
      	}
      
      public:
      	Stack(int n = 4)
      	{
      		_a = (STDataType*)malloc(sizeof(STDataType) * n);
      		if (nullptr == _a)
      		{
      			perror("malloc申请空间失败");
      			return;
      		}
      		_capacity = n;
      		_top = 0;
      	}
      	//拷贝函数
      	Stack(const Stack& st)
      	{
      		_a = (STDataType*)malloc(sizeof(STDataType) * st._capacity);
      		if (nullptr == _a)
      		{
      			perror("malloc申请空间失败");
      			return;
      		}
      		memcpy(_a, st._a, sizeof(STDataType) * st._top);
      		_top = st._top;
      		_capacity = st._capacity;
      	}
      	void Push(STDataType x)
      	{
      		if (_top == _capacity)
      		{
      			int newcapacity = _capacity * 2;
      			STDataType* tmp = (STDataType*)realloc(_a ,sizeof(STDataType) * newcapacity);
      			if (nullptr == tmp)
      			{
      				perror("malloc申请失败");
      				return;
      			}
      			_a = tmp;
      			_capacity = newcapacity;
      		}
      		_a[_top++] = x;
      	}
      	
      private:
      	STDataType* _a;
      	size_t _capacity;
      	size_t _top;
      };
      
      public:
          // 构造函数
          MyClass() {
              std::cout 
              std::cout 
          MyClass obj; // 创建对象
          // 在main函数结束时,对象obj将销毁,析构函数会被自动调用
          return 0;
      }
      
      public:
      	Stack(int n = 4)
      	{
      		_a = (STDataType*)malloc(sizeof(STDataType) * n);
      		if (nullptr == _a)
      		{
      			perror("malloc申请空间失败");
      			return;
      		}
      		_capacity = n;
      		_top = 0;
      	}
      	//拷贝函数
      	Stack(const Stack& st)
      	{
      		_a = (STDataType*)malloc(sizeof(STDataType) * st._capacity);
      		if (nullptr == _a)
      		{
      			perror("malloc申请空间失败");
      			return;
      		}
      		memcpy(_a, st._a, sizeof(STDataType) * st._top);
      		_top = st._top;
      		_capacity = st._capacity;
      	}
      	void Push(STDataType x)
      	{
      		if (_top == _capacity)
      		{
      			int newcapacity = _capacity * 2;
      			STDataType* tmp = (STDataType*)realloc(_a ,sizeof(STDataType) * newcapacity);
      			if (nullptr == tmp)
      			{
      				perror("malloc申请失败");
      				return;
      			}
      			_a = tmp;
      			_capacity = newcapacity;
      		}
      		_a[_top++] = x;
      	}
      	//析构函数
      	~Stack()
      	{
      		//cout 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]