过程性编程和面向对象编程

过程性编程(POP)和面向对象编程(OOP)

从今天开始我们将正式开始接触面向对象这个概念
首先,我们来回顾一下什么是面向过程型编程

过程性编程

我们用做奶茶的例子来给各位举例子
准备数据:牛奶 500ml、茶包 2 个、糖 20g、杯子 1 个(独立的 “数据”);
拆分步奏(函数):
函数 1:煮茶(输入茶包 + 水,输出茶汤);
函数 2:混合(输入茶汤 + 牛奶,输出奶茶汤);
函数 3:加糖(输入奶茶汤 + 糖,输出甜奶茶);
函数 4:装杯(输入甜奶茶 + 杯子,输出成品奶茶);
程序执行:按顺序调用「煮茶→混合→加糖→装杯」,把独立的数据一步步传递给函数处理。
这就是所谓的面向过程型编程,思路是一步步的过程,且操作与数据分离

用学生管理系统演示过程性编程

#include <iostream>
#include <string>
using namespace std;

// 1. 独立的数据:用结构体存储学生信息(仅数据,无操作)
struct Student {
    string name;  // 数据:姓名
    int score;    // 数据:分数
};

// 2. 独立的操作(函数):处理学生数据,需传入数据作为参数
// 查分数函数
void getScore(Student s) {
    cout << s.name << "的分数是:" << s.score << endl;
}

// 改分数函数
void setScore(Student &s, int newScore) {  // 用引用修改原数据
    s.score = newScore;
    cout << s.name << "的分数已修改为:" << newScore << endl;
}

// 3. 主程序:按顺序调用函数,传递数据
int main() {
    Student stu = {"张三", 85};  // 定义独立数据
    getScore(stu);               // 调用函数处理数据
    setScore(stu, 92);           // 调用函数修改数据
    getScore(stu);
    return 0;
}

面向对象编程

在介绍面向对象思想之前,要明确三个概念

封装(Encapsulation)

核心是 “打包 + 隐藏”
打包:把奶茶的数据(牛奶、茶包、糖)和操作(煮茶、混合、加糖)封装成 “奶茶类”;
隐藏:隐藏奶茶的内部数据(比如牛奶的用量、糖的种类),外部不能直接改,只能通过奶茶类提供的方法(比如 “少糖”“多奶”)来调整,保证数据安全。
对应 C++:类中的私有成员(private) 是隐藏的(外部不能访问),公有成员(public) 是对外提供的方法(外部只能通过这些方法操作私有数据)。

类(Class)

是模板、蓝图、设计图
比如 “奶茶类” 是一个模板,定义了所有奶茶都有的数据和操作,它不是具体的奶茶,只是一个规范;
对应 C++:类是自定义的一种数据类型(和 int、string 一样,是一种类型),定义了该类型包含哪些数据(成员变量)和哪些操作(成员函数 / 方法)。

对象(Object)

是类的具体实例
用 “奶茶类” 这个模板,做出来的一杯具体的 “珍珠奶茶”“芋圆奶茶”,就是奶茶类的对象;
对应 C++:用类定义的变量,就是对象(比如Student stu;,stu 就是 Student 类的对象),一个类可以创建无数个对象。

用学生管理系统来演示面向对象思想

#include <iostream>
#include <string>
using namespace std;

// 1. 定义类:封装数据和操作,核心是class关键字(C++ Primer重点)
class Student {
private:
    // 私有成员:数据(隐藏,外部不能直接访问/修改,封装的核心)
    string name;
    int score;

public:
    // 公有成员:操作数据的方法(对外接口,外部只能通过这些方法操作数据)
    // 1. 初始化对象(构造函数,C++ Primer必学,用来创建对象时给数据赋值)
    Student(string n, int s) {
        name = n;
        score = s;
    }

    // 2. 查分数的方法
    void getScore() {
        // 成员函数可以直接访问私有成员(数据和操作绑定,不用传参)
        cout << name << "的分数是:" << score << endl;
    }

    // 3. 改分数的方法
    void setScore(int newScore) {
        // 可以在方法内加校验,保证数据合法(封装的优势:数据安全)
        if (newScore >= 0 && newScore <= 100) {
            score = newScore;
            cout << name << "的分数已修改为:" << newScore << endl;
        } else {
            cout << "分数不合法!必须在0-100之间" << endl;
        }
    }
};

// 2. 主程序:创建对象,调用对象的方法(不用关心内部实现)
int main() {
    // 创建对象:Student类的具体实例,调用构造函数初始化数据
    Student stu("张三", 85);  

    // 操作对象:调用公有方法,无需传递数据(对象自己管理数据)
    stu.getScore();          // 查分数
    stu.setScore(92);        // 改分数(合法)
    stu.getScore();          
    stu.setScore(150);       // 改分数(不合法,对象内部会校验,数据不会被修改)

    // 错误:外部不能直接访问私有成员(封装的隐藏性),编译器会报错
    // cout << stu.name << endl;
    // stu.score = 100;

    return 0;
}
posted @ 2026-01-31 18:40  努力的小xu  阅读(4)  评论(0)    收藏  举报