一、类和对象
类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。
二、类的定义
- 声明
class Stock
{
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();
}
类的成员分为两种:一种是成员数据,另一种是成员函数。
也可以分为私有和公有成员,一般把数据设置为私有,把成员函数设置为公有。因为c++中强调数据的隐藏,把公有的成员函数当做接口供用户使用。私有成员只有成员函数才有权访问
另外定义位于类声明中的函数都将自动成为内联函数,因此Stock::set_tot()是一个内敛函数
- 定义
首先需要在定义文件中包含类声明的头文件,然后定义类中声明的成员函数。定义成员函数时使用作用于解析运算符 :: 来标识函数所属的类另,另外类方法可以访问类的private组件
#includ"stock.h"
void Stock::acquire(const std::string & co,long n,double pr)
{
company=co; //因为在类中定义了company 所以可以在成员函数定义的时候直接使用company
shares=n;
shar_val=pr;
set_tot();
}
void buy(long num,double price);
{
......
}
void sell(long num,double price);
{
......
}
void update(double price);
{
.......
}
void show();
{
......
}
内联函数的特殊规则要求在每个使用它们的文件中都对其进行定义。确保内联定义对多文件程序中的所有文件都可用的、最简单的方法是:将内联函数放在类的头文件中。内联函数一般都放在头文件中
- 类的使用
使用类的时候需要包含声明类的头文件,并与定义类的文件一起编译。然后通过类创建对象,使用类的成员函数(接口),操作对象。
调用对象的成员函数类似于调用结构的成员函数
#include"stock.h"
int main()
{
Stock fluffy_the_cat;
fluffy_the_cat.acquire("NanoSmart",20,12.50);
fluffy_the_cat.show();
}
三、类的构造函数和析构函数
- 构造函数
就是通过类创建对象的时候自动对对象进行初始化
-
构造函数的特点:
(1)名称与类相同。例如,Stock类的构造函数是名为Stock()的成员函数
(2)构造函数没有声明类型,即没有返回值。 -
声明和定义构造函数
在类的声明的头文件中加入成员函数:
Stock(const std::string & co, long n=0,double pr=0)
默认参数的使用当没有对形参n和pr赋值的情况下自动设置为0.
在类的定义文件中对构造函数定义:
Stock(const std::string & co, long n,double pr)
{
company=co;
shares=n;
shar_val=pr;
set_tot();
}
- 使用构造函数
构造函数的使用方式不同于其他类方法。一般来说,使用对象来调用方法
stock.show();但是无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。因此构造函数被用来创建对象,而不能通过对象来调用。
显示地调用构造函数
Stock food=Stock("world",250,1.25);
这种方式调用构造函数可能会产生一个临时的对象,未命名的临时对象赋值给food之后就调用析构函数删除临时对象。
隐式地调用构造函数
Stock food("world",250,1.25);
四、对象数组的初始化
初始化对象数组的方案是:首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中。因此,要创建类对象数组,则这个类必须有默认构造函数。
const int STKS=10;
Stock stocks[STKS]={
Stock("NanoSmart",12.5,20),
Stock(),
Stock("Monolithic obelisks",130,3.25);
};
stocks[0]和stocks[2]是先通过默认构造函数来创建对象,然后通过构造函数创建临时对象赋值到相应的元素中。stocks[1]是通过默认函数来进行赋值的。
五、总结
使用面向对象编程思想(OOP)解决问题的第一步是根据它与程序之间的接口来描述数据,从而指定如何使用数据。然后,设计一个类来实现该接口。
一般来说,私有数据成员存储信息,共有成员函数(又称为方法)提供访问数据的唯一途径。类将数据和方法组合成一个单元,其私有性实现数据隐藏。
将类声明分成两部分组成,通常将这两部分保存在不同的文件中。
- 类声明(包括有函数原型表示的方法)应放到头文件中;
- 定义成员函数的源代码放在方法文件中。