第二部分:C++面向对象编程
C++面向对象编程(Object - Oriented Programming,OOP)是一种编程范式,它基于以下几个核心概念:类(class)、对象(object)、封装(encapsulation)、继承(inheritance)和多态(polymorphism)。
一、类和对象
1. 类的定义
类是一种用户自定义的数据类型,它将数据(成员变量)和操作这些数据的函数(成员函数)组合在一起。例如,定义一个表示点的类:
// 定义类 Point class Point { public: // 成员函数:设置点的坐标 void setCoordinates(int x, int y) { this->x = x; this->y = y; } // 成员函数:获取点的x坐标 int getX() const { return x; } // 成员函数:获取点的y坐标 int getY() const { return y; } private: int x; int y; }; // 注意用分号;结束
在这个Point类中,x和y是私有成员变量,用于存储点的坐标。setCoordinates、getX和getY是公有成员函数,分别用于设置坐标和获取坐标。
2. 对象的创建和使用
对象是类的实例。可以通过以下方式创建Point类的对象并使用其成员函数:
int main() { Point p; p.setCoordinates(3, 4); std::cout << "The point has coordinates (" << p.getX() << ", " << p.getY() << ")"; return 0; }
二、封装
封装是将数据和操作数据的方法包装在一起,并对外部隐藏数据的实现细节。在上面的Point类中,x和y被声明为私有成员变量,外部代码不能直接访问它们,只能通过公有成员函数来操作。这样可以保护数据的完整性,防止外部代码随意修改数据。
在C++中,有三种访问控制符:public(公有)、private(私有)和protected(保护)。
公有成员:可以被类的外部代码访问。
私有成员:只能被类的成员函数和友元函数访问。
保护成员:类似于私有成员,但在继承关系中有特殊用途,子类可以访问父类的保护成员。
三、继承
继承允许创建一个新类(派生类),它从现有类(基类)继承属性和行为。例如,定义一个表示圆形的类Circle,它继承自Point类(假设圆心可以用点来表示):
class Circle : public Point { public: // 成员函数:设置圆的半径 void setRadius(int r) { radius = r; } // 成员函数:获取圆的半径 int getRadius() const { return radius; } private: int radius; };
在这个Circle类中,它继承了Point类的成员变量(x和y)和成员函数(setCoordinates、getX和getY),同时添加了自己的成员变量radius和相关成员函数。
在C++中,有三种继承类型:public继承、private继承、protected继承。
public继承:保持基类的访问级别不变,派生类可以将基类的公有成员作为自己的公有成员,将基类的保护成员作为自己的保护成员。
private继承:将基类的所有成员变为派生类的私有成员。
protected继承:将基类的公有成员变为派生类的保护成员,基类的保护成员在派生类中仍然是保护成员。
四、多态
多态允许以统一的方式处理不同类型的对象。在C++中,多态主要通过虚函数实现。例如,定义一个基类Shape和两个派生类Rectangle和Circle:
class Shape { public: virtual double area() const = 0; }; class Rectangle : public Shape { public: Rectangle(int width, int height) : width(width), height(height) {} double area() const override { return width * height; } private: int width; int height; }; class Circle : public Shape { public: Circle(int radius) : radius(radius) {} double area() const override { return 3.14159 * radius * radius; } private: int radius; };
在Shape类中定义了一个纯虚函数area,这使得Shape类成为抽象类。Rectangle和Circle类都继承自Shape类,并实现了自己的area函数。
2. 多态的使用
可以通过基类指针或引用以多态的方式调用派生类的函数:
int main() { Shape* shapes[2]; shapes[0] = new Rectangle(3, 4); shapes[1] = new Circle(2); for (int i = 0; i < 2; i++) { std::cout << "The area of the shape is: " << shapes[i]->area() << std::endl; } for (int i = 0; i < 2; i++) { delete shapes[i]; } return 0; }
在这个例子中,shapes数组存储了Shape类的指针,但实际上指向Rectangle和Circle的对象。通过调用area函数,可以根据对象的实际类型执行相应的计算。