【C++】拷贝构造函数及析构函数
📢博客主页:https://blog.csdn.net/2301_779549673
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨
文章目录
- 📢前言
- 🏳️🌈什么是拷贝构造函数
- ❤️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
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。