- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
7.8 函数与 array 对象
在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论