实现类的成员函数
实现类的第二个步骤就是为在类声明中的函数原型提供代码,成员函数定义与常规函数非常类似,它们有函数头与函数体,也有返回类型和参数,但是它们还包含两个特殊的特征
- 定义成员函数使用作用域解析符( : : :: ::)来标识函数所属的类
- 类方法可以访问类的 p r i v a t e private private组件
首先成员函数的函数头使用作用域解析符来指出函数所属的类 如下所示
void Stock::update(double price);
上述代码表示update函数是Stock类的成员函数。
因此作用域解析运算符确定了方法定义对应的类的身份,我们说标识符update()具有类作用域。Stock类的其他成员函数不必使用作用域解析符号,就可以使用update方法,因为它们属于同一个类。类方法的完整名包含类名,我们说 Stock::update()是函数的限定名,而简单的update()是全名的缩写(非限定名),他只能在类作用域中使用。
内联方法
其定义位于类声明中的函数都将自动成为内联函数,类声明通常将短小函数的作为内联函数。如果希望也可以在类声明之外定义内联成员函数,只需要在定义函数的使用 i n l i n e inline inline关键词就可以了,内联的函数的特殊规则要求在每个使用它的文件中都进行定义,为了确保内联定义对多文件程序中的所有程序可用,最简便的方法是在类声明定义内联函数
方法使用哪个对象
如何创建类对象,最简单的方法是声明类变量
Stock apple,google;
如何使用成员函数
apple.show();
google.buy(20,12.99);
调用成员函数他将使用被用来调用它的对象的数据成员
所创建的每个对象都有自己的存储空间,用于存储其内部变量和类成员,但是所有的类的对象共享同一组类的方法。即每一个方法只有一个副本(遵循函数是静态的法则)。也就是说它们将执行同一个代码块,只是将这些代码块用于不同的数据,在OOP中调用成员函数被称为发送信息
使用类
C++的目标是使得使用类和使用基本的内置类型尽可能相同,要创建类对象,可以声明类变量或者使用new为类对象分配内存空间,还可以将一个对象赋值给另一个等等等…
客户/服务器模型
OOP程序员常依照客户/服务器模型讨论程序设计,在这个概念中客户是使用类的程序,类声明(包含类方法)构成了服务器,他是程序可以程序可以使用的资源。客户只能通过公有方式定义的接口使用服务器,这意味着客户的唯一职责就是了解该接口,服务器的责任是确保该接口可靠和准确的执行,服务器设计人员只能修改接口的实现接口,而不能修改程序,这样程序员独立的对客户和服务器进行改进,对服务器的修改不会导致对客户的行为以外的影响。
小结
指定类设计的第一步是提供类声明,类声明类似于结构声明,可以包含数据成员和函数成员,声明有私有部分,即只能被成员函数(或者后面提及友元)访问,声明还具有共有部分,在其声明的成员可以直接使用类对象访问,通常类数据成员被放在私有部分,称函数函数被放在公有部分
公有部分的内容构成了设计的抽象部分—公有接口,将数据封装到私有部分可以保护数据的完整性,这被称为数据隐藏。C++通过类设计使得抽象数据隐藏封装等OOP特性很容易实现。
指定类设计的第二部是实现类成员函数,可以在类声明提供函数定义而不是函数声明(除非函数很小可以被作为内联函数),但是通常的做法是在类声明中提供函数声明。在这种情况需要通过作用域解析符来指出成员函数属于哪个类。
要创建对象(或者说类的实例)只需要用类名作为类型名。
类的函数可以通过类的实例来调用,需要使用点号运算符。