返回介绍

7.8 函数与 array 对象

发布于 2024-10-08 23:14:06 字数 2418 浏览 0 评论 0 收藏 0

在 C++中,类对象是基于结构的,因此结构编程方面的有些考虑因素也适用于类。例如,可按值将对象传递给函数,在这种情况下,函数处理的是原始对象的副本。另外,也可传递指向对象的指针,这让函数能够操作原始对象。下面来看一个使用 C++11 模板类 array 的例子。

假设您要使用一个 array 对象来存储一年四个季度的开支:

本书前面说过,要使用 array 类,需要包含头文件 array,而名称 array 位于名称空间 std 中。如果函数来显示 expenses 的内容,可按值传递 expenses:

但如果函数要修改对象 expenses,则需将该对象的地址传递给函数(下一章将讨论另一种方法——使用引用):

这与程序清单 7.13 处理结构时使用的方法相同。

如何声明这两个函数呢?expenses 的类型为 array<double, 4>,因此必须在函数原型中指定这种类型:

这些考虑因素是这个示例程序的核心。该程序还包含其他一些功能。首先,它用符号常量替换了 4:

其次,它使用了一个 const array 对象,该对象包含 4 个 string 对象,用于表示几个季度:

请注意,模板 array 并非只能存储基本数据类型,它还可存储类对象。程序清单 7.15 列出了该程序的完整代码。

程序清单 7.15 arrobj.cpp

下面是该程序的运行情况:

程序说明

由于 const array 对象 Snames 是在所有函数之前声明的,因此可后面的任何函数定义中使用它。与 const Seasons 一样,Snames 也有整个源代码文件共享。这个程序没有使用编译指令 using,因此必须使用 std::限定 array 和 string。为简化程序,并将重点放在函数可如何使用对象上,函数 fill() 没有检查输入是否有效。

函数 fill() 和 show() 都有缺点。函数 show() 存在的问题是,expenses 存储了四个 double 值,而创建一个新对象并将 expenses 的值复制到其中的效率太低。如果修改该程序,使其处理每月甚至每日的开支,这种问题将更严重。

函数 fill() 使用指针来直接处理原始对象,这避免了上述效率低下的问题,但代价是代码看起来更复杂:

在最后一条语句中,pa 是一个指向 array<double, 4>对象的指针,因此*pa 为这种对象,而(*pa) [i]是该对象的一个元素。由于运算符优先级的影响,其中的括号必不可少。这里的逻辑很简单,但增加了犯错的机会。

使用第 8 章将讨论的引用可解决效率和表示法两方面的问题。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文