12. 类与对象——编程世界的“蓝图”与“实例”
12.1 面向对象编程的概念
在编程的世界里,面向对象编程(Object – Oriented Programming,OOP)是一种重要的编程范式。它模拟了现实世界中事物的特征和行为,将数据(属性)和操作这些数据的函数(方法)封装在一起,形成一个独立的单元,这个单元就是类。类就像是一张蓝图,定义了具有相同属性和行为的对象的共同特征;而对象则是根据类创建出来的具体实例,就像根据蓝图建造出来的具体房屋。
12.2 类的定义
在 C++ 中,类的定义使用 class
关键字,基本语法如下:
class 类名 { // 访问修饰符 public: // 公有成员,外部可以直接访问 // 数据成员(属性) // 成员函数(方法) private: // 私有成员,外部不能直接访问,只能通过公有成员函数访问 // 数据成员(属性) // 成员函数(方法) protected: // 受保护成员,在派生类中可以访问 // 数据成员(属性) // 成员函数(方法) };
以下是一个简单的类的定义示例,定义一个表示矩形的类:
#include <iostream> using namespace std; class Rectangle { // 私有成员,外部不能直接访问 private: double length; double width; // 公有成员,外部可以直接访问 public: // 设置矩形的长度 void setLength(double len) { length = len; } // 设置矩形的宽度 void setWidth(double wid) { width = wid; } // 计算矩形的面积 double getArea() { return length * width; } };
在这个示例中,length
和 width
是私有数据成员,外部不能直接访问;setLength
、setWidth
和 getArea
是公有成员函数,外部可以通过这些函数来操作私有数据成员。
12.3 对象的创建和使用
创建对象就是根据类的蓝图创建出具体的实例。创建对象的语法是:类名 对象名;
。创建对象后,就可以使用对象来调用类的公有成员函数。
#include <iostream> using namespace std; class Rectangle { private: double length; double width; public: void setLength(double len) { length = len; } void setWidth(double wid) { width = wid; } double getArea() { return length * width; } }; int main() { // 创建一个 Rectangle 类的对象 Rectangle rect; // 调用对象的成员函数设置长度和宽度 rect.setLength(5.0); rect.setWidth(3.0); // 调用对象的成员函数计算并输出面积 cout << "矩形的面积是: " << rect.getArea() << endl; return 0; }
在这个程序中,首先创建了一个 Rectangle
类的对象 rect
,然后通过对象调用 setLength
和 setWidth
函数设置矩形的长度和宽度,最后调用 getArea
函数计算并输出矩形的面积。
12.4 构造函数和析构函数
- 构造函数:构造函数是一种特殊的成员函数,它的名称和类名相同,没有返回值类型,在创建对象时自动调用,用于初始化对象的数据成员。
#include <iostream> using namespace std; class Rectangle { private: double length; double width; public: // 构造函数 Rectangle(double len, double wid) { length = len; width = wid; } double getArea() { return length * width; } }; int main() { // 创建对象时调用构造函数进行初始化 Rectangle rect(5.0, 3.0); cout << "矩形的面积是: " << rect.getArea() << endl; return 0; }
在这个示例中,定义了一个带有两个参数的构造函数 Rectangle(double len, double wid)
,在创建 Rectangle
对象时,会自动调用这个构造函数并传入相应的参数来初始化对象的长度和宽度。
- 析构函数:析构函数也是一种特殊的成员函数,它的名称是在类名前加上
~
,没有返回值类型,也没有参数,在对象销毁时自动调用,用于释放对象占用的资源。
#include <iostream> using namespace std; class Rectangle { private: double length; double width; public: Rectangle(double len, double wid) { length = len; width = wid; cout << "矩形对象已创建" << endl; } // 析构函数 ~Rectangle() { cout << "矩形对象已销毁" << endl; } double getArea() { return length * width; } }; int main() { { Rectangle rect(5.0, 3.0); cout << "矩形的面积是: " << rect.getArea() << endl; } // 对象 rect 超出作用域,析构函数自动调用 return 0; }
在这个程序中,定义了一个析构函数 ~Rectangle()
,当对象 rect
超出其作用域时,析构函数会自动调用,输出相应的信息。
12.5 访问修饰符的作用
- public:公有成员可以在类的外部直接访问,通常将类的接口(成员函数)设置为公有,方便外部调用。
- private:私有成员只能在类的内部访问,外部不能直接访问,通常将类的数据成员设置为私有,通过公有成员函数来间接访问和修改,这样可以保证数据的安全性和封装性。
- protected:受保护成员在类的内部和派生类中可以访问,在外部不能直接访问,常用于继承关系中。
12.6 课后小练习
- 定义一个表示圆的类
Circle
,包含私有数据成员radius
(半径),公有成员函数setRadius
用于设置半径,getArea
用于计算圆的面积,编写构造函数对半径进行初始化。在main
函数中创建Circle
对象,设置半径并输出圆的面积。 - 定义一个表示学生的类
Student
,包含私有数据成员name
(姓名)、age
(年龄),公有成员函数setName
、setAge
用于设置姓名和年龄,displayInfo
用于输出学生的信息,编写构造函数对姓名和年龄进行初始化。在main
函数中创建Student
对象,设置信息并输出学生信息。
通过这部分的学习,你了解了类与对象的基本概念、类的定义、对象的创建和使用,以及构造函数、析构函数和访问修饰符的作用。类与对象是面向对象编程的核心,掌握它们可以让你编写出更具模块化、可维护性和可扩展性的程序。