c++ 数组_C/C++编程知识分享:C++ 手把手教你实现可变长的数组

本文介绍如何实现一个可自动扩展的自定义数组类MyArray,包括必要的构造函数、复制构造函数、析构函数、赋值运算符重载、索引运算符重载、push_back方法及获取数组长度的方法,并探讨了进一步优化的方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9333ccd8126ab1b2dc44d67a7aff85da.png

01 实现自定义的可变长数组类型

假设我们要实现一个会自动扩展的数组,要实现什么函数呢?先从下面的main函数给出的实现,看看有什么函数是需要我们实现的。

87d1279cbab727f97ed11178a8b1952f.png

输出结果:

3f6ec942927caa4927107481578b9457.png

要实现的方式,要做哪些事情呢?我先列一下:

(1)要用动态分配的内存来存放数组元素,需要一个指针成员变量

(2)重载赋值=运算符

(3)重载[]运算符

(4)重载复制构造函数

(5)实现push_back和length()函数

02 MyArray类的实现步骤

要实现一个可变长数组类的,基本需要实现下面的7个函数:

93af6e6134ace8e1126383c4f19d3ca8.png

1. 构造函数

构造函数的目的就是初始化一个数组,代码如下:

9f305d0e4f4733338b6e9d46b9e832b9.png

2. 复制构造函数

复制构造函数目的就是产生一个与入参对象一样的对象,但是由于MyArray类是有指针成员变量的,所以我们必须才用深拷贝的方式来实现复制构造函数,如果使用默认的复制构造函数,则会导致两个对象的指针成员变量指向的地址是同一个,这是非常危险的。

15bbcbf4c7cc62d73380881e528bb69e.png

3. 析构函数

析构函数的目的就是释放数组的资源。

ca0b51d8be20effd080c42f2562f4970.png

4. 重载赋值=运算符函数

重载赋值=运算符函数目的就使=号左边对象里存放的数组,大小和内容都和右边的对象一样。

7aed7f649fbbd1dba27c05c87da5e5bb.png

5. 重载[]运算符函数

重载[]运算符函数目的就是能通过[]运算符来获取对应下标的数组值。

1cefd9ed253dbcfcc5c5d25e7a06fe10.png

6. 加入元素到数组末尾的函数

push_back函数的目的就是把一个新的元素,加入到数组的末尾。

fa5e7d0fe94e91a87a80ae1240615d0d.png

7. 获取数组长度的函数

length()函数就比较简单了,直接返回成员变量m_size,就是数组的长度了。

93b0c4984faf11498f0d8fe93e212c9e.png

03 小结

可变长数组类型实现的整体代码,如下:

e5659336191cbf5272b5c67f4f90afb8.png

86584b60f873d51c79810677c2ad52f4.png

26c57c94d24f3880c578b270f51d2b78.png


实际上本次的可变长的数组类还缺少一下函数,比如:删除某个元素的函数、清空数组的函数等等,这些可以留给大家思考。

还有就是 push_back 函数还有优化的空间,当前的 push_back 函数每加入一个元素都会重新分配新的内存,这是会增大开销的,那么优化的思路:

提前分配好一个 n 大小的空间,当数组大小不够的时候,则才继续重新分配 2n 大小的空间,以此类推。

博客园:小林coding

学习C/C++编程,关注C/C++更多知识,欢迎关注笔者的学习专栏:

C/C++学习笔记​zhuanlan.zhihu.com
aea35d6ff52d7ff27625ca1ba0eea4f5.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值