作者 | 梁唐
大家好,我是梁唐。
这是EasyC++系列的第56篇,类的定义。
根据C++ Primer中的描述,类的定义是一种将抽象转换为用户定义类型的C++工具。也就是说类的实质是一种用户自定义类型,它可以将数目表示和操作数据的方法组合成一个整洁的包。
在实际开发当中,想要实现一个类,并编写一个使用它的程序是相对比较复杂的,涉及多个步骤。
通常,我们会将类的定义放在头文件当中,并将实现的代码放在源代码文件中。我们来看C++ Primer当中的一个例子:一个关于股票买卖的类。
首先是类的定义,写在stock00.h
文件中。
#ifndef STOCK00_H_
#define STOCK00_H_
#include <string>
class Stock {
private:
std::string company;
long shares;
double share_val;
double total_val;
void set_tot() {total_val = shares * share_val;}
public:
void accquire(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();
};
#endif
首先是关键字class
,它表示我们声明的是一个类,一般类名我们使用大驼峰命名法定义。
其次在这个类的定义当中,我们看到了两个新出现的关键字private
和public
。这两个关键字描述了对类成员的访问控制,使用类对象的程序,都可以直接访问公有部分(public),但无法访问对象的私有成员。
想要获取私有成员,只能通过公有的成员函数。比如在上面这个例子当中,我们想要修改share_val
只能通过公有的方法sell
或buy
,而无法直接对变量的值进行修改。防止程序直接访问数据修改数据被称为数据隐藏。
除了public
和private
,C++当中还提供了第三个关键字叫做protected
,这个关键字和类的继承有关,我们将会在之后的文章当中进行讨论。
数据隐藏的思想其实是认为类中的成员变量的所有权应该属于类本身,当我们需要对类中的数据进行读取和修改的时候,应当通过类提供的公开方法,而不是直接操作类中值。这被认为是一种面向对象的思想,即只能通过类提供的方法访问数据,而不应该直接访问数据。
C++正是基于这种面向对象的思想设计的,所以类中的成员默认是private
的,我们可以省去private
关键字:
class World {
float mass;
char name[30];
public:
void tellall();
...
};
我们从类的描述看上去很像是包含了成员函数以及数据隐藏的结构体,但实际上这是因为C++对结构体进行了拓展,让它具有了和类相同的特性。在C语言当中,结构体是没有这么多特性的。
比如我们可以给结构体设计构造函数,也可以给结构体添加成员函数,甚至结构体也可以继承、派生和多态。
它们之间唯一的区别是,结构体的默认类型是public
,而类是private
。所以通常使用类来实现对象,而结构体只用来结构化地存储数据。
另外多说一句,数据隐藏的面向对象理念并不适用于所有语言。比如Python,Python当中的类中的成员变量默认是public
,且没有private
关键字。