对象和类
OOP特性:
1. 抽象
2. 封装和数据隐藏
3. 多态
4. 继承
5. 代码的可重用性
10.1 过程性编程和面向对象编程
采用OOP方法时:
1. 描述对象所需的数据以描述用户与数据交互所需的操作;
2. 确定如何实现接口和数据存储
10.2 抽象和类
抽象:
类表示人们可以用类方法的公有接口对类对象执行操作,这是抽象;
抽象是通往用户定义类型的捷径,C++中用户定义类型是实现抽象接口的类设计
数据隐藏:
类的数据成员可以是私有的(默认值),这意味着只能通过成员函数来访问这些数据,这是数据隐藏
封装:
实现的具体细节(如数据表示和方法的代码)都是隐藏的,这就是封装
类型:
1. 决定数据对象需要的内存数量
2. 决定如何解释内存中的位(long 和 float 在内存中占用的位数相同,但将他们转换为数值的方法不同)
3. 决定可使用数据对象执行的操作和方法
10.2.2 C++中的类
类规范由两部分组成:
类声明: 以数据成员的方式描述数据部分,以成员函数(方法)的方式描述公有接口
类方法定义: 描述如何实现类成员函数
简单地说,类声明提供了类的蓝图,而方法定义提供了细节
什么是接口:
接口是一个共享框架,供两个系统交互时使用;
接口让程序员能编写与类对象交互的代码,从而让程序能够使用类对象
类声明:
1 #include<iostream> 2 #include<cstring> 3 4 class Stock 5 { 6 private: 7 char company[30]; 8 int shares; 9 double share_val; 10 double total_val; 11 void set_tot() { total_val = shares * share_val; } 12 public: 13 void acquire(const char*co, int n, double pr); 14 void buy(int num, double price); 15 void sell(int num, double price); 16 void update(double price); 17 void show(); 18 };
关键字 class 指出这些代码定义了一个类设计;
Stock 成为一个新的类型名,能够声明 Stock 类型的变量,称为对象或实例:
Stock sally; // 创建 Stock 对象 sally
Stock solly; // 创建 Stock 对象 solly
关键字 private 和 public 描述了对类成员访问控制:
使用类对象的程序都可以直接访问共有部分;
只能通过共有成员函数访问对象的私有成员;
共有成员函数提供了对象和程序之间的接口;
防止程序直接访问数据被称为数据隐藏:
数据隐藏(将数据放在类的私有部分中)是一种封装;
封装的另一个例子,将类函数定义和类声明放在不同的文件中
数据项通常放在私有部分,组成类接口的成员函数放在共有部分;
不必在类声明中使用关键字 private,因为这是类对象的默认访问控制
10.2.3 实现类成员函数
类成员函数定义特征:
1. 定义成员函数时,使用作用域解析操作符(::)来标识函数所属的类
2. 类方法可以访问类的 private 组件
将类声明放在头文件中,而将类成员函数定义放在单独的一个源代码文件中;
定义位于类声明中的函数都将自动成为内联函数;
调用成员函数时,他将使用被调用他的对象的数据成员:
所创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员;
同一个类的所有对象共享同一组类方法,即每种方法只有一个副本
10.2.4 使用类
C++ 的目标是使得使用类与使用基本的内置类型尽可能相同:
要创建类对象,可以声明类变量,也可以使用 new 为类对象分配存储空间;
可以把对象作为函数的参数和返回值,也可以将一个对象赋给另一个对象
使用新类型,最关键的是要了解成员函数的功能,而不必考虑实现的细节
10.2.5 小结
类设计:
1. 提供类声明
class className
{
private:
data member declarations // 将数据放私有部分中可以保护数据的完整性,数据隐藏
public:
member function prototypes
};
2. 实现类成员函数
3. 类成员函数(方法)通过类对象调用
Bozo bozetta;
cout << Bozetta.Retort();
实现文件:
stock1.h 文件提供类声明:
1 #ifndef STOCK1_H_ 2 #define STOCK1_H_ 3 class Stock 4 { 5 private: 6 char company[30]; 7 int shares; 8 double share_val; 9 double total_val; 10 void set_tot() { total_val = shares * share_val; } 11 public: 12 Stock(); 13 Stock(const char *co, int n = 0, double pr = 0.0); 14 ~Stock(); 15 16 void buy(int num, double price); 17 void sell(int num, double price); 18 void update(double price); 19 void show(); 20 }; 21 22 #endif
stock1.cpp 文件实现了类成员函数的定义
1 #include<iostream> 2 #include "stock1.h" 3 4 Stock::Stock() 5 { 6 std::cout << "Default constructor called "; 7 std::strcpy(company, "no name"); 8 shares = 0; 9 share_val = 0.0; 10 total_val = 0.0; 11 } 12 13 Stock::Stock(const char *co, int n, double pr) 14 { 15 std::cout << "Constructor using " << co << " called "; 16 std::strncpy(company, co, 29); 17 company[29] = '