函数式 vs 面向对象编程在 C++ 中:2025 年如何选择?

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么面向对象与函数式方法的争论从未停歇?

\n\n

如果您曾思考过为新项目选择哪种 C++ 编程风格,您并不孤单。关于 函数式编程与面向对象方法 在 C++ 中的争论已经持续了数十年。一方面是经典的面向对象编程,这是大学里教授的内容。另一方面是现代的函数式技术,这些技术由 C++11、C++14、C++17 和 C++20 标准引入。

\n\n

在 pythonlib.ru 网站上,我们经常讨论架构决策,现在是时候彻底弄清楚这个问题了。哪种风格更快?哪种更容易维护?最重要的是,它们可以结合使用吗?

\n\n

在本文中,我们不会狂热地捍卫某一种范式。相反,我们将分析真实的代码示例,展示每种方法的优缺点,并提供实用建议。开始吧!

\n\n

C++ 中范式的简要概述

\n\n

在深入探讨之前,让我们快速回顾一下这些概念。

\n\n

面向对象编程 (OOP)

\n\n

C++ 中的面向对象编程建立在三大支柱之上:封装、继承和多态。您创建将数据及其处理方法结合在一起的类。这是 90 年代和 2000 年代占主导地位的经典方法。

\n\n
class Animal {\npublic:\n    virtual void speak() const = 0;\n    virtual ~Animal() = default;\n};\n\nclass Dog : public Animal {\npublic:\n    void speak() const override {\n        std::cout << "Woof!" << std::endl;\n    }\n};\n\nclass Cat : public Animal {\npublic:\n    void speak() const override {\n        std::cout << "Meow!" << std::endl;\n    }\n};\n\nvoid makeSound(const Animal& animal) {\n    animal.speak();\n}\n
\n\n

函数式编程 (FP)

\n\n

C++ 中的函数式方法 并非纯粹的 Haskell,而是在命令式语言框架内使用函数式编程的思想。关键要素包括:lambda 函数、数据不可变性、高阶函数 和组合。

\n\n
std::vector<int> numbers = {1, 2, 3, 4, 5};\n\n// 函数式风格:过滤和转换\nauto result = numbers\n    | std::views::filter([](int n) { return n % 2 == 0; })\n    | std::views::transform([](int n) { return n * n; });\n\nfor (int n : result) {\n    std::cout << n << " ";  // 输出:4 16\n}\n
\n\n

实践对比:三个典型任务

\n\n

让我们选取 C++ 开发人员会遇到的三个真实任务,看看面向对象编程和函数式编程如何解决它们。

\n\n

任务 1:处理数据集合

\n\n

条件: 有一个订单列表,需要过滤出昂贵的订单(价格 > 1000),按日期排序,并输出前 5 个。

\n\n

面向对象风格:

\n\n
class OrderProcessor {\npublic:\n    void addOrder(Order order) { orders_.push_back(std::move(order)); }\n    \n    std::vector<Order> getTopExpensiveRecent(int count) const {\n        auto filtered = orders_;\n        filtered.erase(\n            std::remove_if(filtered.begin(), filtered.end(),\n                           [](const Order& o) { return o.price <= 1000; }),\n            filtered.end());\n        \n        std::sort(filtered.begin(), filtered.end(),\n                  [](const Order& a, const Order& b) {\n                      return a.date > b.date;\n                  });\n        \n        if (filtered.size() > count) {\n            filtered.resize(count);\n        }\n        return filtered;\n    }\n    \nprivate:\n    std::vector<Order> orders_;\n};\n
\n\n

函数式风格:

\n\n
auto getTopExpensiveRecent(const std::vector<Order>& orders, int count) {\n    return orders\n        | std::views::filter([](const Order& o) { return o.price >                

博客

书籍推荐