类
在 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";
}