【C++04】类和对象
一:面向对象程序设计(Object Oriented Programming缩写:OOP)
OOP是一种程序设计范型,同时也是一种程序开发的方法。 对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
在C++中,类是一种规范,它描述了这种新型数据格式,对象是根据这种规范构造的特定数据结构。例如,类可以描述学生的基本特征(姓名、学号、班级等),而对象代表某个特定的学生。
OOP程序设计方法首先设计类,它将数据和方法合并起来准确地表示了程序要处理的东西。
二:抽象和类
1.对类型的认识
当你申明一个 int 型变量时,不仅仅是分配内存,还规定了对变量执行的操作(例如:如果该变量为指针,就不能执行乘除运算)。指定基本类型完成了三件事:
(a) 决定数据对象需要的内存数量;
(b) 决定如何解释内存中的位(有些类型在内存中占的位数相同,但将它们转化为数值的方法不同);
(c) 决定可使用数据对象执行的操作或方法。
对于内置类型来说,有关操作的信息被内置到编译其中;但在C++中对于用户自定义类型来说,必须自己提供这些信息。
2.C++中的类的定义
关键字 class 标识类定义,下图是一个简单的 Student 类定义
关键字 public 和 private 描述了对类成员的访问控制(C++还提供了一个访问控制关键字 protected),使用类对象的程序都可直接访问共有部分,但只能通过公有成员函数来访问对象的私有成员(防止程序直接访问数据被称为数据隐藏)。公有成员函数是程序和对象私有成员之间的桥梁。
类设计尽可能将公有接口与实现细节分开,公有接口表示设计的抽象组件。C++的封装性体现在以下几个方面:
(a) 将实现细节放在一起并将它们与抽象分开;
(b) 数据隐藏是一种封装;
(c) 将实现的细节隐藏在私有部分也是一种封装(完整定义一个私有成员函数);
(d) 将类函数申明和定义放在不同的文件中。
无论类成员是数据成员还是成员函数,都可以在类的共有部分或私有部分申明它。但由于隐藏数据是OOP的主要目标之一,因此数据项通常放在私有部分,组成类接口的成员函数放在公有部分;也可以把成员函数放在私有部分,通常使用私有成员函数来处理不属于公有接口的实现细节。
类和结构: C++对结构进行了扩展,使之具有与类相同的特性。它们的唯一区别是结构成员的默认访问类型是 public,而类为 private。通常在使用时用结构表示纯粹的数据对象。
3.实现类成员函数
首先你必须明白的是成员函数可以直接定义在类内(申明与定义没有分开)。
上图是类中两个成员函数的实现,与常规函数定义非常类似。但是他们有两个特殊的特征:
(a) 定义成员函数时,使用作用域运算符 (::) 来标识函数所属的类(表示出了我们定义的 show() 函数是 Student 类的成员。这不仅将 show() 标示为成员函数,还意味着我们可以将另一个类的成员函数也命名为 show()实现某种功能);
(b) 类方法可以访问类的私有成员。
Student 类的其他成员函数不必使用作用域解析运算符就可以使用其中的某一种方法(例如:show()),因为他们属于同一类。
类方法的完整名称中包括类名,Student::show() 是函数的限定名;而简单的 show() 是非限定名,它只能在类作用域中使用。
4.类实例化对象
类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;.一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间来存储类成员变量。
下图是在 main() 函数里面定义了 s1 和 s2 两个对象并调用成员函数
5.类对象存储模型
上图是同一个类实例化出多个对象时系统对内存的使用模型,因成员函数存储的特殊性,对象的大小为类中所有成员变量的大小之和(当然在计算大小时遵从内存对齐原则)。