《c++语言导学》——2.3 类

2.3 类

上面这种将数据与其操作分离的做法有其优势,比如我们可以非常自由地使用它的数据部分。不过对于用户自定义类型来说,为了将其所有属性捏合在一起,形成一个“真正的类型”,在其表示形式和操作之间建立紧密的联系还是很有必要的。特别是,我们常常希望自定义的类型易于使用和修改,希望数据具有一致性,并且希望表示形式最好对用户是不可见的。此时,最理想的做法是把类型的接口(所有代码都可使用的部分)与其实现(对外部不可访问的数据具有访问权限)分离开来。在C++中,实现上述目的的语言机制称为类(class)。类含有一系列成员(member),可能是数据、函数或者类型。类的public成员定义了该类的接口,private成员则只能通过接口访问。例如:

在此基础上,我们可以定义一个Vector类型的变量:

下图解释了这个Vector对象的含义:

总的来说,Vector对象是一个“句柄”,它包含指向元素的指针(elem)以及元素的数量(sz)。在不同Vector对象中元素的数量可能不同(本例是6),即使同一个Vector对象在不同时刻也可能含有不同数量的元素(见4.2.3节)。不过,Vector对象本身的大小永远保持不变。这是C++语言处理可变数量信息的一项基本技术:一个固定大小的句柄指向位于“别处”(如通过new分配的自由存储,见4.2.2节)的一组可变数量的数据。第4章的主题就是学习如何设计并使用这样的对象。
在这里,我们只能通过Vector的接口访问其表示形式(成员elem和sz)。Vector的接口是由其public成员构成的,包括Vector()、operator和size()。2.2节的read_and_sum()示例可简化为:

与所属类同名的“函数”称为构造函数(constructor),即它是用来构造类的对象的。因此构造函数Vector()替换了2.2节的vector_init()。构造函数有一个特性与普通函数不同,它确保只用于初始化类的对象,因此定义一个构造函数可以解决类变量未初始化问题。
Vector(int)规定了Vector对象的构造方式,此处意味着需要一个整数来构造对象,这个整数用于指定元素的数量。该构造函数使用成员初始值列表来初始化Vector的成员:

这条语句的含义是:首先从自由存储获取s个double类型的元素,用一个指向这些元素的指针初始化elem;然后使用s初始化sz。
访问元素的功能是由一个下标函数提供的,它叫做operator[],它的返回值是元素的引用(double&)。
size()函数的作用是向使用者提供元素的数量。
显然,在上面的代码中完全没有涉及错误处理,与之有关的内容将在3.4节提及。同样我们也没有提供一种机制来“归还”通过new获取的double数组,4.2.2节将介绍如何使用析构函数来完成这一任务。
我们常用的两个关键字struct和class没有本质区别,唯一的不同是struct的成员默认是public的。例如,我们也可以为struct定义构造函数和其他成员函数,这一点与class完全一致。

时间: 2024-09-23 22:10:43

《c++语言导学》——2.3 类的相关文章

《Java语言导学(原书第6版)》一一第2章 面向对象的编程概念 2.0

第2章The Java Tutorial: A Short Course on the Basics, Sixth Edition面向对象的编程概念如果没有用过面向对象的程序语言,编写Java程序之前一定要先学一些面向对象编程的基本概念.本章介绍对象.类.继承.接口和包等基本概念.每节都通过生活中的例子来解释这些基本概念,同时介绍Java程序语言的语法.2.1节关注对象的概念.对象是具有相关状态和行为的软件.软件对象经常用于建模生活中的对象.本节介绍对象的状态和行为的表示方式以及数据封装的概念,

《Java语言导学(原书第6版)》一一2.2 类

2.2 类 生活中有很多个体对象,它们都属于同一种类型.例如,生活中可能有上千辆自行车,但是它们的制作工艺和模型都一样.它们都基于同样的设计图纸制作而成,因此包含相同的组件.在面向对象术语中,称这些自行车是对象类--自行车类的实例.类是创建个体对象的蓝图. 比如,下述Bicycle类给出了实现自行车的一种方法: 上述Java语言的语法可能有点陌生,但该类的设计完全基于对前面自行车对象的讨论.cadence.speed和gear等字段表示对象的状态,changeCadence.changeGear

《Java语言导学(原书第6版)》一2.2 类

2.2 类 生活中有很多个体对象,它们都属于同一种类型.例如,生活中可能有上千辆自行车,但是它们的制作工艺和模型都一样.它们都基于同样的设计图纸制作而成,因此包含相同的组件.在面向对象术语中,称这些自行车是对象类--自行车类的实例.类是创建个体对象的蓝图.比如,下述Bicycle类给出了实现自行车的一种方法: 上述Java语言的语法可能有点陌生,但该类的设计完全基于对前面自行车对象的讨论.cadence.speed和gear等字段表示对象的状态,changeCadence.changeGear和

《Java语言导学(原书第6版)》一导读

前 言 自2010年年初Oracle公司收购Sun公司以来,Java语言迎来激动人心的时代.正如Java Community Process计划的活动所印证的,Java语言将不断发展.本书基于Java SE 8(Java Platform Standard Edition 8)并引用其API. 相比本书第5版(针对的是Java版本7),第6版有一些新特点: Lambda表达式使得功能可作为方法参数使用,代码作为数据使用.Lambda表达式描述单个方法接口(也称为功能接口)的实例会更简洁.4.4.

《Java语言导学(原书第6版)》一3.2 运算符

3.2 运算符 学习了如何声明和初始化变量之后,下面看看如何利用这些变量来做点事情.学习Java程序语言的运算符是个很好的切入点.运算符是一类特殊的符号,它们执行1个.2个或3个运算对象上的特定操作,然后返回结果. 研究Java程序语言的运算符时,先了解这些运算符的优先级可能会有帮助.表3-2根据优先级顺序列出了所有的运算符.越靠近表的顶端,运算符的优先级越高.优先级较高的运算符先计算,相对较低的后计算.同一行的运算符优先级相等.当表达式中出现优先级相等的运算符时,计算规则如下:赋值运算符从右到

《Java语言导学(原书第6版)》一一3.2 运算符

3.2 运算符 学习了如何声明和初始化变量之后,下面看看如何利用这些变量来做点事情.学习Java程序语言的运算符是个很好的切入点.运算符是一类特殊的符号,它们执行1个.2个或3个运算对象上的特定操作,然后返回结果. 研究Java程序语言的运算符时,先了解这些运算符的优先级可能会有帮助.表3-2根据优先级顺序列出了所有的运算符.越靠近表的顶端,运算符的优先级越高.优先级较高的运算符先计算,相对较低的后计算.同一行的运算符优先级相等.当表达式中出现优先级相等的运算符时,计算规则如下:赋值运算符从右到

《Java语言导学(原书第6版)》一第2章 面向对象的编程概念

第2章 面向对象的编程概念如果没有用过面向对象的程序语言,编写Java程序之前一定要先学一些面向对象编程的基本概念.本章介绍对象.类.继承.接口和包等基本概念.每节都通过生活中的例子来解释这些基本概念,同时介绍Java程序语言的语法.

《Java语言导学(原书第6版)》一1.2 “Hello World!”实例程序

1.2 "Hello World!"实例程序 本节详细介绍编译和运行"Hello World!"实例程序的指令.1.2.1节介绍利用集成开发环境NetBeans IDE开发该程序的过程.NetBeans IDE在Java平台上运行,也就是说可在任何配置了JDK的操作系统上运行NetBeans IDE,包括Microsoft Windows.Solaris.Linux和OS X.建议尽可能使用NetBeans IDE取代命令行.1.2.2节和1.2.3节依次介绍不使用

《Java语言导学(原书第6版)》一一1.2 “Hello World!”实例程序

1.2 "Hello World!"实例程序 本节详细介绍编译和运行"Hello World!"实例程序的指令.1.2.1节介绍利用集成开发环境NetBeans IDE开发该程序的过程.NetBeans IDE在Java平台上运行,也就是说可在任何配置了JDK的操作系统上运行NetBeans IDE,包括Microsoft Windows.Solaris.Linux和OS X.建议尽可能使用NetBeans IDE取代命令行.1.2.2节和1.2.3节依次介绍不使用