欢迎光临
我们一直在努力

第十二章:C++11 新特性系统梳理(上)——写出“现代 C++”的第一步

目录

一、为什么一定要学 C++11?

二、auto:让编译器做它最擅长的事

1.auto 解决了什么问题?

2.auto 的正确用法

3.auto 的边界(高质量代码必须知道)

三、nullptr:彻底告别“指针陷阱”

1.NULL 的历史问题

2.nullptr 的本质

3.正确实践

四、范围 for:让“遍历”回归本质

1.传统 for 的问题

2.C++11 范围 for

3.什么时候用引用?

五、enum class:真正类型安全的枚举

1.传统 enum 的隐患

2.enum class 的改进

3.推荐规范

六、using:typedef 的现代替代方案

1.typedef 的局限

2.using 的优势

七、constexpr:让“计算”发生在编译期

1.编译期常量的价值

2.constexpr 示例

八、本篇总结


一、为什么一定要学 C++11?

在真实工程和面试中:

  • 会 C++98 → 代码陈旧

  • 不懂 C++11 → 无法阅读现代代码

  • 不会用 → 写不出高质量 C++

现代 C++ 的核心目标只有三个:

  • 更安全(少裸指针)

  • 更高效(少拷贝)

  • 更易读(少模板噪音)

  • 本篇聚焦:语言级基础改进


    二、auto:让编译器做它最擅长的事

    1.auto 解决了什么问题?

    在模板和 STL 时代,类型往往又长又难写:

    std::vector<std::map<int, std::string>>::iterator it = v.begin();

    可读性极差,维护成本高。


    2.auto 的正确用法

    auto it = v.begin();

    优点:

    • 提升可读性

    • 减少类型错误

    • 配合模板极其友好

    3.auto 的边界(高质量代码必须知道)

    不推荐:

    auto a = 1; // 类型语义不清

    推荐:

    auto it = container.begin();
    auto lambda = [](int x) { return x * 2; };

    经验法则:

    当类型显而易见、或冗长难写时,使用 auto


    三、nullptr:彻底告别“指针陷阱”

    1.NULL 的历史问题

    void func(int);
    void func(int*);

    func(NULL); // 二义性

    NULL 本质是 0 或 0L,不是指针类型。


    2.nullptr 的本质

    nullptr // 类型:std::nullptr_t

    只表示“空指针”,不会被当作整数

    3.正确实践

    int* p = nullptr;

    if (p == nullptr) {
    // 明确的指针语义
    }

    现代 C++ 中,禁止使用 NULL


    四、范围 for:让“遍历”回归本质

    1.传统 for 的问题

    for (int i = 0; i < v.size(); ++i) {
    cout << v[i] << endl;
    }

    • 容易越界

    • 与容器细节强耦合


    2.C++11 范围 for

    for (const auto& val : v) {
    cout << val << endl;
    }

    优点:

    • 更安全

    • 更清晰

    • 自动适配容器

    3.什么时候用引用?

    for (auto& val : v) {
    val *= 2; // 修改元素
    }

    读:const auto& 写:auto&


    五、enum class:真正类型安全的枚举

    1.传统 enum 的隐患

    enum Color { RED, GREEN };
    enum Status { OK, FAIL };

    Color c = OK; // 居然合法

    作用域污染 + 隐式转换


    2.enum class 的改进

    enum class Color { Red, Green };
    enum class Status { Ok, Fail };

    Color c = Color::Red;

    优点:

    • 强类型

    • 有作用域

    • 不可隐式转换


    3.推荐规范

    所有新代码,禁止使用旧 enum


    六、using:typedef 的现代替代方案

    1.typedef 的局限

    typedef std::map<int, std::string> MapType;

    在模板场景下可读性差。


    2.using 的优势

    using MapType = std::map<int, std::string>;

    可读性更强 支持模板别名

    template<typename T>
    using Vec = std::vector<T>;


    七、constexpr:让“计算”发生在编译期

    1.编译期常量的价值

    • 提高性能

    • 保证安全

    • 减少魔法数


    2.constexpr 示例

    constexpr int square(int x) {
    return x * x;
    }

    int arr[square(5)]; // 合法

     能在编译期算的,不要留到运行期


    八、本篇总结

    这一篇你应该真正理解的是:

    • auto 是 可读性工具

    • nullptr 是 类型安全工具

    • 范围 for 是 语义抽象

    • enum class 是 强类型设计

    • using / constexpr 是 现代工程能力

     C++11 的核心不是“新”,而是“正确”

    赞(0)
    未经允许不得转载:171主机测评 » 第十二章:C++11 新特性系统梳理(上)——写出“现代 C++”的第一步
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址