C++中,通过定义类来自定义数据类型。类定义了该类型的对象包含的数据和该类型的对象可以执行的操作。标准库类型string、istream和ostream都定义成类
1 从操作开始设计类
每个类都定义了一个接口(interface)和一个实现(implementation)。接口由使用该类的代码需要执行的操作组成。实现一般包括类所需要的数据。实现还包括定义该类需要的但又不供一般性使用的函数。
定义类是,通常先定义该类的接口,即该类所提供的的操作。通过这些操作,可以决定该类完成其功能所需要的数据,以及是否需要定义一些函数来支持该类的实现。
2 定义Sales_item类
很明显,我们能够定义一种包含这三个数据元素和所用到的操作的数据类型。定义这种数据类型的方法就是定义类。
class Sales_item{
public:
private:
std::string isbn;
unsigned units_sold;
double revenue;
};
类定义以关键字class开始,其后是该类的名字标识符。类体位于花括号里面。花括号后面必须要跟一个分号。
类可以为空。类体定义了组成该类型的数据和操作。这些操作和数据是类的一部分,也称为类的成员(member)。操作称为成员函数,而数据称为数据成员。
类可以包含0个到多个private或public访问标号。访问标号控制类的成员在类外部是否可访问。使用该类的代码可能只能访问public成员。
定义了类,也就定义了一种新的类型。类名就是该类型的名字。通过命名Sales_item类,表示Sales_item是一种新的类型,而且程序也可以定义该类型的变量。
每一个类都定义了它自己的作用域。也就是说,数据和操作的名字在类的内部必须唯一,但可以重新定义在类外的名字。
3 类的数据成员
定义类的数据成员和定义普通变量有些相似,我们同样是指定一种类型并给该成员一个名字
std::string isbn;
unsigned units_sold;
double revenue;
这个类含有三个数据成员:一个名为isbn的string类型成员,一个名为units_sold的unsigned类型成员,一个名为revenue的double类型成员。累的数据成员定义了该类类型对象的内容。当定义Sales_item类型的对象时,这些对象将包含一个string型变量,一个unsigned型变量和一个double型变量。
定义变量和定义数据成员存在非常重要的区别:一般不能把类成员的初始化作为其定义的一部分。当定义数据成员时,只能指定该数据成员的名字和类型。类不是在类定义里定义数据成员时初始化数据成员,而是通过成构造函数的特殊成员函数控制初始化。
4 访问符号
访问符号负责控制使用该类的代码是否可以使用给定的成员。类的成员函数可以使用类的任何成员,而不管其访问级别。访问标号public,private可以多次出现在类定义中。给定的访问标号应用到下个访问标号出现为止。
类中public部分定义的成员在程序的任何部分都可以访问,一般把操作放在public部分,这样程序中的任何代码都可以执行这些操作。
不是类的组成部分的代码不能访问private成员。通过设定Sales_item的数据成员为private,可以保证对Sales_item对象进行操作的代码不能直接操纵其数据成员。就像程序不能访问类中的private成员。Sales_item类型的对象可以执行那些操作,但是不能直接修改这些数据。
5 使用struct关键字
C++支持另一个关键字struct,它可以定义类类型,struct关键词从c继承过来的
如果使用class关键字来定义类,那么定义在第一个访问标号前的任何成员都隐式指定为private:如果使用struct关键字,那么这些成员都是public。使用class还是struct关键字来定义类,仅仅影响磨人的初始访问级别。