本节书摘来自华章计算机《c++语言导学》一书中的第2章,第2.2节,[美] 本贾尼·斯特劳斯特卢普 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.2 结构
构建新类型的第一步通常是把所需的元素组织成一种数据结构。下面是一个struct的示例:
![e459c4ca6169be8c78b48c17cb9477858f7a74cc](https://i-blog.csdnimg.cn/blog_migrate/214db192c07bf5b47a67cb5890e55cc9.png)
这是Vector的第一个版本,其中包含一个int和一个double*。
Vector类型的变量可以通过下述形式进行定义:
![7e00bf1b5d6226de36ebc97a83f3e98868ac89a4](https://i-blog.csdnimg.cn/blog_migrate/68f48d2bb12bc8522267960f3c8dbe3f.png)
仅就v本身而言,它的用处似乎不大,因为v的elem指针并没有指向任何实际的内容。为了让它变得更有用,我们需要令v指向某些元素。例如,我们可以构造一个如下所示的Vector:
![823ecfc8c47e4b977ea0be8491135a23448fd6cc](https://i-blog.csdnimg.cn/blog_migrate/71bfd2f0ec5fa21b4a232653f8d52fa6.png)
也就是说,v的elem成员被赋予了一个由new运算符生成的指针,而sz成员的值则是元素的个数。Vector&中的符号&指定我们通过非const引用(见1.8节)的方式传递v,这样vector_init()就能修改传入其中的向量了。
new运算符从一块名为自由存储(free store)(又称为动态内存(dynamic memory)或堆(heap))的区域中分配内存。分配在自由存储中的对象独立于它所处的作用域,它会一直“存活”到使用delete运算符(见4.2.2节)销毁它为止。
Vector的一个简单应用如下所示:
![66460ebed3000fdb07e3c2b2e898ebd620e06ac5](https://i-blog.csdnimg.cn/blog_migrate/3908e4ac15d51a587d1ad96ebfeeffc6.png)
显然,在优雅程度和灵活性上我们的Vector与标准库vector还有很大差距,尤其是Vector的使用者必须清楚地知道它的所有细节。本章余下部分以及接下来的两章将把Vector当作呈现语言特性和技术的一个示例,一步步地完善它。作为对比,第9章介绍标准库vector,在其中蕴含着很多漂亮的改进。
本书使用vector和其他标准库组件作为示例是为了达到以下两个目的:
- 展现语言特性和程序设计技术;
- 帮助读者学会使用这些标准库组件。
不要想着重写vector和string等标准库组件,直接使用它们更为明智。
访问struct的成员有两种方式:一种是通过名字或引用,这时我们使用.(点运算符);另一种是通过指针,这时用到的是->。例如:
" >