类
在 C++ 中,类是一个关键概念,凭借其封装和继承的特性,能够助力程序员之间实现高效的分工协作,共同完成复杂的大型项目。我们先从最简单的概念入手,再进行更深层次的了解和应用。
1. 类的定义
类是用户自定义的一种数据类型,它将数据和对数据进行操作的成员函数封装在一起,用于表示现实世界中的事物或抽象概念。
1.1 类和函数有什么区别呢?
如果将程序比作一个工厂,函数就像是工厂中的各种机器,每台机器完成特定的任务;而类就像是工厂中的工人,他们不仅携带工具(成员变量),还掌握技能(成员函数),可以独立地完成复杂的任务。
如果是实现一个 独立的、简单的功能,且不需要管理状态,使用函数可能更合适。**如果功能涉及到 数据和行为的结合,并且需要管理状态,使用类会更合适。**如管理一个对象的状态,用户档案。还比如需要将数据和操作封装在一起,操作一些图形,文件。或者说需要较为复杂的继承,例如游戏角色的分化,从单纯的角色分化为主角和各类小怪。
1.2 类和函数的例子
让我们以一个银行账户的数据管理为例,如果我们只是使用函数的话,那么有以下代码:
#include <string>
#include <iostream>
using namespace std;
int main()
{
string liyang_name = "李阳"; // 李阳的账户名称
string liyang_number = "12345678"; // " 账号
long liyang_balance = 1000; // " 账户余额
string zhouyan_name = "周燕"; // 周燕的账户名称
string zhouyan_number = "87654321"; // " 账号
long zhouyan_balance = 200; // " 账户余额
liyang_balance -= 200; // 李阳取出 200 元
zhouyan_balance += 100; // 周燕存入 100 元
cout << "■李阳的账户:\"" << liyang_name << "\" (" << liyang_number << ") " << liyang_balance << "元\n";
cout << "■周燕的账户:\"" << zhouyan_name << "\" (" << zhouyan_number << ") " << zhouyan_balance << "元\n";
}
在这里,我们想要用不同的账户进行存取,只能在变量名的命名中进行变化,每次都要建立新的变量,管理十分复杂。那么我们试着将账户看作一个类,这个类里面有各种成员,每个成员代表了不同的账户属性。当想要建立用户的账户时,就相当于建立了一个实体对象。每进行一次存取,就是存入一个数据,就只需要那么只需要操作这一个实体对象里面的数据即可。
如果我们使用类去存储数据,就可以使用下面的代码:
#include <string>
#include <iostream>
using namespace std;
class Account {//声明类的名字和成员
public:// 先不用管,还没有学到
string name; // 账户名称
string number; // 账号
long balance; // 账户余额
};
int main()
{
Account liyang; // 李阳的账户
Account zhouyan; // 周燕的账户
liyang.name = "李阳"; // 李阳的账户名称
liyang.number = "12345678"; // 账号
liyang.balance = 1000; // 账户余额
zhouyan.name = "周燕"; // 周燕的账户名称
zhouyan.number = "87654321"; // 账号
zhouyan.balance = 200; // 账户余额
liyang.balance -= 200; // 李阳取出200元
zhouyan.balance += 100; // 周燕存入100元
cout << "■李阳的:账户" << liyang.name << " (" << liyang.number
<< ") " << liyang.balance << "元\n";
cout << "■周燕的账户:" << zhouyan.name << " (" << zhouyan.number
<< ") " << zhouyan.balance << "元\n";
}
而怎样理解类和对象的关系呢?就可以概括为类是抽象的,而对象是类的实体。就是月饼模具和月饼本身的关系,而你想选择的馅料和饼皮材料便是对象的实体数据,不一样的材料,做出了不一样的月饼,也便有了不一样的月饼。
2. 类的成员-变量与函数
1.成员变量与成员函数
类的主体由成员变量和成员函数组成,以上个银行账户管理系统的代码为例,这里面只有成员变量,并没有成员函数。那么我们每次存钱或者取钱的时候,要在main函数中手动进行加减余额,这相当于多了一次理解的规则,每次存入100元钱相当于要使用这个命令balance += 100,那么如果将这个命令直接变为语言可以理解的规则,我们直接使用deposit(100) (deposit英文释义:存入) 这个语句,就可以直接让银行余额变多100元了。这里就可以使用成员函数来实现这件事了。
//在类中写下存入函数
void deposit(long amnt) {
crnt_balance += amnt;
}
//在main函数中直接调存入函数
zhouyan.deposit(100); // 周燕存入100元
3. 公有成员函数与私有成员变量
类中的成员变量和成员函数,它们通过访问限定符来控制外部对它们的访问权限, 分别为private(私有)、protected(受保护)或 public(公有)。私有成员只能在类的内部被访问。类的外部代码和派生类都不能直接访问私有成员。受保护成员只能在类的内部和派生类(子类)中被访问。类的外部代码不能直接访问受保护成员。公有成员可以在类的外部被访问。任何对象都可以直接访问公有成员。
这种分类并不是固定的,而是根据设计需求来决定的。不过,通常情况下,成员变量被声明为 private,成员函数被声明为 public,这种设计有其合理性和优势。成员变量的私有保证了数据的封装性,外部代码不可以修改数据的类型;成员函数作为类的接口,可以通过外部代码与类的对象进行交互。
class Account {
private:
string full_name; // 账户名称
string number; // 账号
long crnt_balance; // 账户余额
public:
// 返回账户名称
string name() {
return full_name;
}
// 返回账号
string no() {
return number;
}
// 返回账户余额
long balance() {
return crnt_balance;
}
// 存入
void deposit(long amnt) {
crnt_balance += amnt;
}
// 取出
void withdraw(long amnt) {
crnt_balance -= amnt;
}
};
4. 构造函数
在成员函数中,必须要有的便是构造函数,构造函数是C++中的一种特殊函数,它在创建对象时自动被调用,用于初始化对象。构造函数的名称必须与类名相同,并且没有返回类型(包括void)。构造函数的主要作用是为对象的成员变量赋初值,确保对象在创建时处于一个已知的、有效的状态。
class Account {
private:
string full_name; // 账户名称
string number; // 账号
long crnt_balance; // 账户余额
public:
// 构造函数
Account(string name, string num, long amnt) {
full_name = name; // 账户名称
number = num; // 账号
crnt_balance = amnt; // 账户余额
}
};
int main()
{
Account liyang("李阳", "12345678", 1000); // 初始化李阳的账户
Account zhouyan("周燕", "87654321", 200); // 初始化周燕的账户
/
}
5.完整的示例代码及其类的成员
// 银行账户类(第2版)及类的使用例程
#include <string>
#include <iostream>
using namespace std;
class Account {
private:
string full_name; // 账户名称
string number; // 账号
long crnt_balance; // 账户余额
public:
// 构造函数
Account(string name, string num, long amnt) {
full_name = name; // 账户名称
number = num; // 账号
crnt_balance = amnt; // 账户余额
}
// 返回账户名称
string name() {
return full_name;
}
// 返回账号
string no() {
return number;
}
// 返回账户余额
long balance() {
return crnt_balance;
}
// 存入
void deposit(long amnt) {
crnt_balance += amnt;
}
// 取出
void withdraw(long amnt) {
crnt_balance -= amnt;
}
};
int main()
{
Account liyang("李阳", "12345678", 1000); // 李阳的账户
Account zhouyan("周燕", "87654321", 200); // 周燕的账户
liyang.withdraw(200); // 李阳取出200元
zhouyan.deposit(100); // 周燕存入100元
cout << "■李阳的账户:" << liyang.name() << " (" << liyang.no()
<< ") " << liyang.balance() << "元\n";
cout << "■周燕的账户:" << zhouyan.name() << " (" << zhouyan.no()
<< ") " << zhouyan.balance() << "元\n";
}