10.2.1 类型是什么
基本类型完成了下面的三项工作:
* 决定数据对象需要的内存数量;
* 决定如何解释内存中的位(long和float在内存中占用的位数相同,但是将它们转换为数值的方法不同);
* 决定可以使用数据对象执行的操作或方法。
在于内置类型来说,有关操作的信息被内置到编译器中。但在C++中定义用户自定义的类型时,必须自己提供这些信息。付出这些老动换来了根据实际需要定制新数据类型的强大功能和灵活性。
10.2.2 C++中的类
一般来说,类规范由两部分组成:
* 类声明:以数据成员的方式描述数据部分,以成员函数(被称为方法)的方式描述公有接口。
* 类方法定义:描述如何实现类成员函数。
简单地说:类声明提供了类的蓝图,而方法定义则提供了细节。
类声明样例:
程序清单10.1 stock00.h
// stock00.h -- Stock class interface // version 00 #ifndef STOCK00_H_ #define STOCK00_H_ #include <string> class Stock // class declaration { private: std::string company; long shares; double share_val; double total_val; void set_tot() { total_val = shares * share_val; } public: void acquire(const std::string & co, long n, double pr); void buy(long num, double price); void sell(long num, double price); void update(double price); void show(); }; // note semicolon at the end #endif
Stock是这个新类的类型名。该声明让我们能够声明Stock类型的变量——称为对象或实例。每个对象都表示一支股票。例如,下面的声明创建两个Stock对象,它们分别名为sally和solly:
Stock sally;
Stock solly;
这里,sally对象可以表示Sally持有的某公司股票。
1.访问控制
关键字private和public也是新的,它们描述了对类成员的访问控制。
使用类对象的程序都可以直接访问公有部分,单只能通过共有成员函数(或友元函数)来访问对象的私有成员。【友元函数——11章】
共有成员函数是程序和对象的私有成员之间的桥梁,提供了对象和程序之间的接口。
防止程序直接访问数据被称为数据隐藏。
C++还提供了第三个访问空置关键字protected。【protected关键字——13章】
类设计尽可能将共有接口与实现细节分开。共有接口表示设计的抽象组件。
将实现细节放在一起并将它们与抽象分开被称为封装。数据应藏(将数据放在类的私有部分中)是一种封装。
2.控制对成员的访问:公有还是私有
10.2.3 实现类成员函数
成员函数的定义与常规函数定义非常相似,它们有函数头和函数体,也可以有返回类型和参数。但是它们还有两个特殊的特征:
* 定义成源函数时,使用作用于解析运算符(::)来标识函数所属的类;
* 类方法可以访问类的private组件。
例如,update成员函数的函数头如下:
void Stock::update(double price)
例:类的实现
程序清单10.2 stock00.cpp
// stock00.cpp -- implementing the Stock class // version 00 #include <iostream> #include "stock00.h" void Stock::acquire(const std::string & co, long n, double pr) { company = co; if (n < 0) { std::cout << "Number of shares can't be negative, " << company << " shares set to 0. "; shares = 0; } else shares = n; share_val = pr; set_tot(); } void Stock::buy(long num, double price) { if (num < 0) { std::cout << "Number of shares purchased can't be negative. " << "Transaction is aborted. "; } else { shares += num; share_val = price; set_tot(); } } void Stock::sell(long num, double price) { using std::cout; if (num < 0) { cout << "Number of shares sold can't be negative. " << "Transaction is aborted. "; } else if (num > shares) { cout << "You can't sell more than you have! " << "Transaction is aborted. "; } else { shares -= num; share_val = price; set_tot(); } } void Stock::update(double price) { share_val = price; set_tot(); } void Stock::show() { std::cout << "Company: " << company << " Shares: " << shares << " " << " Share Price: $" << share_val << "Total Wroth: $" << total_val << " "; }
10.2.4 使用类
……
10.2.5 修改实现
……
10.2.6 小结
典型的类声明格式如下:
class className
{
private:
data member declarations
public:
member function prototypes
}