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

07-21 1211阅读

📢博客主页: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购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]