你应该使用的 10 个鲜为人知的 C++ 功能

wk

尽管 C++ 已有 40 多年的历史,但它仍然是世界上功能最强大、使用最广泛的编程语言之一?根据 TIOBE 指数,C++ 一直位列最受欢迎的 5 种语言。

抛开历史不说,最近很受欢迎的《黑神话·悟空》国产3A单机动作类游戏大作所使用的游戏引擎就是基于C++开发的虚幻5(UE5)来的。想学习虚幻引擎的赶紧C++先学起来!!

本文将揭示 C++ 的 10 个鲜为人知的功能,这些功能可以显著提高您的编码效率、可读性和性能


带有初始化器的基于范围的 for 循环

C++20 为基于范围的 for 循环引入了一个强大的增强功能:初始值设定项。此功能允许您在循环头中声明变量,从而简化代码并缩小范围。

#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    
    for (auto size = numbers.size(); const auto& num : numbers) {
        std::cout << num << " out of " << size << std::endl;
    }
    return 0;
}

当你需要为循环的持续时间设置变量,但又想限制其范围以防止在其他地方意外使用时,此功能特别有用。


结构化绑定

C++17 中引入的结构化绑定允许您将元组、键值对和其他多元素对象解压缩到命名变量中。此功能显著提高了代码的可读性。

#include <map>
#include <string>
#include <iostream>

int main() {
    std::map<std::string, int> ages = {{"Alice", 30}, {"Bob", 25}};
    
    for (const auto& [name, age] : ages) {
        std::cout << name << " is " << age << " years old." << std::endl;
    }
    
    return 0;
}

当使用返回多个值的函数或迭代键值容器时,结构化绑定特别有用。


内联变量

C++17 引入了内联变量,这有助于减少全局状态问题并改进代码组织。它们对于头文件中的 const 变量特别有用。

#include <string_view>

inline constexpr std::string_view APP_NAME = "MyAwesomeApp";
inline constexpr int MAX_USERS = 100;

内联变量非常适合配置常量或需要在多个文件之间共享的任何值,而不会冒多个定义的风险。


std::optional

C++17 中引入的 std::optional 提供了一种更安全、更富有表现力的方式来处理可选值。这是对可选数据使用 sentinel 值或指针的绝佳替代方法。

#include <optional>
#include <string>
#include <iostream>

std::optional<std::string> get_middle_name(const std::string& full_name) {
    // Implementation omitted for brevity
    return std::nullopt; // or return the middle name if found
}

int main() {
    auto middle_name = get_middle_name("John Doe");
    if (middle_name) {
        std::cout << "Middle name: " << *middle_name << std::endl;
    } else {
        std::cout << "No middle name found." << std::endl;
    }
    return 0;
}

std::optional 对于可能返回也可能不返回值的函数特别有用,在许多情况下无需错误代码或异常。


std::variant

C++17 中添加的 std::variant 是一个类型安全的联合,可以保存多种可能类型的值。它是处理异构数据的绝佳工具。

#include <variant>
#include <string>
#include <iostream>

int main() {
    std::variant<int, float, std::string> data;
    
    data = 10;
    std::cout << std::get<int>(data) << std::endl;
    
    data = "Hello";
    std::cout << std::get<std::string>(data) << std::endl;
    
    return 0;
}

std::variant 在需要以类型安全的方式处理多种类型的情况下特别有用,例如解析不同的数据格式或实现状态机。


Constexpr If

constexpr if 在 C++17 中引入,支持编译时决策。此功能在模板元编程和编写更高效的代码时特别有用。

#include <type_traits>
#include <iostream>

template<typename T>
void print_type_info(const T& value) {
    if constexpr (std::is_integral_v<T>) {
        std::cout << "Integral type: " << value << std::endl;
    } else if constexpr (std::is_floating_point_v<T>) {
        std::cout << "Floating-point type: " << value << std::endl;
    } else {
        std::cout << "Other type" << std::endl;
    }
}

int main() {
    print_type_info(42);
    print_type_info(3.14);
    print_type_info("Hello");
    return 0;
}

constexpr if 允许您编写更灵活的模板,并在许多情况下避免使用 SFINAE,从而获得更简洁、更易于维护的代码。


默认和已删除的函数

C++11 引入了显式默认或删除特殊成员函数的功能。此功能使您可以对类行为进行精细控制。

class NonCopyable {
public:
    NonCopyable() = default;
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable& operator=(const NonCopyable&) = delete;
};

defaulted 和 deleted 函数对于控制对象复制、移动和销毁行为特别有用,有助于防止不需要的操作并强制执行类不变量。


std::string_view

std::string_view 是 C++17 引入的一个类模板,用于表示一个不可变的字符串视图。它提供了一种高效的方式来引用一个现有的字符串或字符串片段,而无需复制其内容。

#include <string_view>
#include <iostream>

void print_uppercase(std::string_view str) {
    for (char c : str) {
        std::cout << static_cast<char>(std::toupper(c));
    }
    std::cout << std::endl;
}

int main() {
    std::string s = "Hello, World!";
    print_uppercase(s);
    
    const char* cstr = "C-style string";
    print_uppercase(cstr);
    
    return 0;
}

当您需要对字符串进行只读访问并希望避免不必要的复制时,尤其是在性能关键型代码中,std::string_view 特别有用。


总结

性能优化不论在什么开发场景中都避不开的话题,尤其是游戏开发领域,大型高耗的大作对于性能的处理非常重要,这直接决定了游戏品质,如果你正在考虑学习C++,那么请一开始就保持一个良好的编码习惯,理解并使用这些精辟的语法非常重要哈。

当然,如果你觉得C++太难学了,那么学Python吧,现在AI时代,还能干一波大的,之前用过的一个不错的人工智能学习网站这里直接贴地址,供各位有需要的点击传送,直达智能未来!

https://www.captainbed.cn/rr

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代号0408

轻轻一点,暖心房

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值