没有合适的资源?快使用搜索试试~ 我知道了~
《Professional C++ 3rd》第7章 熟悉类与对象
需积分: 0 0 下载量 166 浏览量
2023-02-15
10:26:30
上传
评论
收藏 66KB DOCX 举报
温馨提示
试读
31页
译自《Professional C++ 3rd》7 Gaining Proficiency with Classes╯and Objects 主要内容: ➤如何使用方法和数据成员编写自己的类 ➤如何控制对方法和数据成员的访问 ➤如何在堆栈和堆上使用对象 ➤对象的生命周期是什么 ➤如何编写创建或销毁对象时执行的代码 ➤如何编写代码来复制或分配对象
资源推荐
资源详情
资源评论
1
第 7 章 熟悉类与对象
第 7 章 熟悉类与对象 .............................................................................................................1
1.电子表格示例介绍 ................................................................................................................3
2.编写类 ....................................................................................................................................3
2.1 类定义 .............................................................................................................................3
2.1.1 类成员 .....................................................................................................................4
2.1.2 访问控制 .................................................................................................................4
2.1.3 声明的顺序 .............................................................................................................5
2.2 定义方法 ........................................................................................................................6
2.2.1 访问数据成员 .........................................................................................................7
2.2.2 调用其他方法 .........................................................................................................7
2.2.3 this 指针 ..................................................................................................................9
2.3 使用对象 ......................................................................................................................10
2.3.1 栈上的对象 ...........................................................................................................10
2.3.2 堆上的对象 ...........................................................................................................10
3.对象生命周期 ......................................................................................................................11
3.1 对象创建 ......................................................................................................................11
3.1.1 编写构造函数 .......................................................................................................12
3.1.2 使用构造函数 .......................................................................................................13
3.1.3 提供多个构造函数 ...............................................................................................14
3.1.4 默认构造函数 .......................................................................................................15
3.1.4 构造函数初始化器 ...............................................................................................19
3.1.5 复制构造函数 .......................................................................................................21
3.1.7 Initializer_List 构造函数.........................................................................................24
3.1.8 类内成员初始化 ...................................................................................................26
3.1.9 委托构造函数 .......................................................................................................27
3.1.10 编译器生成的构造函数摘要 .............................................................................27
3.2 对象销毁 ......................................................................................................................28
2
3.3 对象赋值 ......................................................................................................................30
3.3.1 声明赋值运算符 ...................................................................................................30
3.3.2 定义赋值运算符 ...................................................................................................31
3.3.3 显式默认和删除赋值运算符 ...............................................................................32
3.4 区分复制与赋值 ..........................................................................................................32
3.4.1 对象作为返回值 ...................................................................................................33
3.4.2 复制构造函数和对象成员 ...................................................................................33
4. 小结....................................................................................................................................34
这一章有什么?
➤如何使用方法和数据成员编写自己的类
➤如何控制对方法和数据成员的访问
➤如何在堆栈和堆上使用对象
➤对象的生命周期是什么
➤如何编写创建或销毁对象时执行的代码
➤如何编写代码来复制或分配对象
本章的 WROX.COM 下载
请注意,本章的所有代码示例作为本章代码下载的一部分,可在本书网站
www.WROX.COM/go/proc++3e 的下载代码选项卡上下载。
作为一种面向对象的语言,C++提供了使用对象和编写对象定义(称为类)
的工具。你当然可以在没有类和对象的情况下用 C++编写程序,但这样做并不能
充分利用语言最基本和最有用的方面;在没有类的情况下编写 C++程序就像去巴
黎和麦当劳吃饭一样。为了有效地使用类和对象,您必须了解它们的语法和功能。
第 1 章回顾了类定义的基本语法。第 5 章介绍了 C++中面向对象的编程方法,
并给出了类和对象的具体设计策略。本章描述了使用类和对象所涉及的基本概念,
包括编写类定义、定义方法、使用栈和堆上的对象、编写构造函数、默认构造函
数、编译器生成的构造函数、构造函数初始化器(称为
ctor-initializers
)、复制
构造函数、构造函数的初始化列表、析构函数、和赋值运算符。即使你已经熟悉
了类和对象,你也应该浏览一下这一章,因为它包含了你可能还不熟悉的各种信
息。
3
1.电子表格示例介绍
本章和下一章介绍了一个简单电子表格应用程序的可运行示例。电子表格是
由“单元格”组成的二维网格,每个单元格都包含一个数字或字符串。Microsoft
Excel 等专业电子表格提供了执行数学运算的能力,例如计算一组单元格的值之
和。这些章节中的电子表格示例并不试图在市场上挑战微软,但对于说明类和对
象的问题很有用。
电子表格应用程序使用两个基本类:spreadsheet 和 SpreadsheetCell。每个电
子表格对象都包含 SpreadsheetCell 对象。此外,电子表格应用程序类管理电子表
格的集合。本章重点介绍电子表格单元格。第 8 章开发电子表格和电子表格应用
程序类。
注意:本章展示了 SpreadsheetCell 类的几个不同版本,以便逐步引入概念。因此,在
整个章节中,对于类的各种尝试并不总是说明类写作各个方面的“最佳”方法。特别
是,早期的示例省略了通常包含但尚未引入的重要功能。您可以下载该类的最终版本,
如简介中所述。
2.编写类
当您编写类时,可以指定将应用于该类对象的行为或方法,以及每个对象将
包含的属性或数据成员。
在编写类的过程中有两个组件:定义类本身和定义它们的方法。
2.1 类定义
这里是对简单 SpreadsheetCell 类的首次尝试,其中每个单元格只能存储一个
数字:
class SpreadsheetCell
{
public:
void setValue(double inValue);
double getValue() const;
private:
double mValue;
};
如第1章所述,每个类定义都以关键字class和类名开头。类定义是C++中的
语句,因此必须以分号结尾。如果未能用分号终止类定义,编译器可能会给您带
来几个错误,其中大多数错误看起来完全无关。
类定义通常放在以类命名的文件中。例如,SpreadsheetCell类定义可以放在
名为SpreadsheetCell.h的文件中。此规则不强制执行,您可以随意调用文件。
4
2.1.1 类成员
类可以有多个成员。成员要么是成员函数(它又是方法、构造函数或析构函
数),要么是成员变量(也称为数据成员)。
看起来像函数原型的两行声明了该类支持的方法:
void setValue(double inValue);
double getValue() const;
第1章指出,将不将对象更改为常量的成员函数声明为常量总是一个好主意。
看起来像变量声明的行声明了该类的数据成员。
double mValue;
类定义成员函数和它所用到的数据成员。它们仅应用于类的特定实例,即对
象。该规则的唯一例外是静态成员,如第8章所述。【Classes define concepts;
objects contain real bits.类定义概念;对象包含实数位。】因此,每个对象都将包
含自己的mValue变量值。成员函数的实现在所有对象之间共享。类可以包含任
意数量的成员函数和数据成员。不能为数据成员指定与成员函数相同的名称。
2.1.2 访问控制
类中的每个成员都受三个访问说明符之一的约束:public、protected或
private。访问说明符应用于其后的所有成员声明,直到下一个访问说明符。在
SpreadsheetCell类中,setValue()和getValue()方法具有公共访问权限,而mValue
数据成员具有私有访问权限。
类的默认访问说明符是私有的:第一个访问说明符之前的所有成员声明都具
有私有访问规范。例如,将公共访问说明符移到setValue()方法声明的下面,
会使setValue()方法获得私有访问而不是公共访问:
class SpreadsheetCell
{
void setValue(double inValue); // now has private access
public:
double getValue() const;
private:
double mValue;
};
在C++中,结构可以像类一样具有方法。事实上,唯一的区别是结构的默认
访问说明符是公共的,而类的默认访问描述符是私有的。例如,SpreadsheetCell
类可以使用如下结构重写:
struct SpreadsheetCell
{
void setValue(double inValue);
double getValue() const;
5
private:
double mValue;
};
下表总结了三个访问说明符的含义:
访问规范
意义
何时使用
public
任何代码都可以调用公共成
员函数或访问对象的公共数
据成员。
您希望客户端使用的行为(方
法)。
私有和受保护数据成员的访
问方法。
protected
类的任何成员函数都可以调
用受保护的成员函数并访问
受保护的数据成员。派生类的
成员函数可以访问基类的受
保护成员。
您 不 希 望 客 户 端 使 用 的
“Helper”方法。
private
只有类的成员函数才能调用
私有成员函数并访问私有数
据成员。派生类中的成员函数
不能从基类访问私有成员。
默认情况下,所有内容都应该
是私有的,尤其是数据成员。
如果只想允许派生类访问它
们,可以提供受保护的getter
和setter;如果希望客户端访
问 它 们 , 则 可 以 提 供 公 共
getter和seter。
2.1.3 声明的顺序
您可以按任何顺序声明成员和访问控制说明符:C++不施加任何限制,例如
成员函数先于数据成员或公共先于私有。此外,您可以重复访问说明符。例如,
SpreadsheetCell定义可能如下所示:
class SpreadsheetCell
{
public:
void setValue(double inValue);
private:
double mValue;
public:
double getValue() const;
};
但是,为了清楚起见,最好将公共声明、受保护声明和私有声明分组,并将
这些声明中的成员函数和数据成员分组。
剩余30页未读,继续阅读
资源评论
jxlzw
- 粉丝: 3
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- tensorflow-rocm-2.12.1.570-cp38-cp38-manylinux2014-x86-64.whl
- tensorflow-rocm-2.12.1.570-cp311-cp311-manylinux2014-x86-64.whl
- tensorflow-gpu-2.7.1-cp38-cp38-manylinux2010-x86-64.whl
- 路劲
- 红外通信电路设计与实验
- 基于matlab实现的拉普拉斯金字塔分解 做毕业设计的可以参考,小波变换以及MGA的初级参考.rar
- 基于matlab实现的拉普拉斯金字塔分解的图像融合源程序.rar
- 基于matlab实现的里面介绍的是使用禁忌搜索求解vrp,只要修改下数据就可以使用,用的是MATLAB写的.rar
- 基于matlab实现的邻接矩阵和级联失效模拟.rar
- 基于matlab实现的论文“连续相空间转换中的级联故障”代码.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功