尽管 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时代,还能干一波大的,之前用过的一个不错的人工智能学习网站这里直接贴地址,供各位有需要的点击传送,直达智能未来!