第二部分: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函数,可以根据对象的实际类型执行相应的计算。

C++编程语言基础

第二部分:C++面向对象编程