何时在 C++ 中使用字符数组而不是字符串?

问题描述

我们如何在 C++ 中区分字符数组和字符串? 有什么比 std::string 更好的 char 数组吗?

解决方法

我们如何在 C++ 中区分字符数组和字符串?

你不知道,字符串字面量根据定义是以空字符结尾的字符数组。由于数组一有机会就衰减为指针,const char*(仍然)通常是字符串的同义词。

如果您问什么时候应该写 new char[n],答案永远不会。如果有的话,它应该是 std::make_unique<char[]>(n);,除非您正在编写自己的 std::string 版本,否则请使用标准版本。如果您需要缓冲区,请使用 std::vectorstd::array

const char[] 常量相对于 const std::string 有一些优势,但新的 C++ 标准正在“解决”这些问题:

  1. 在 C++20 之前,std::string 不能在 constexpr 上下文中使用。所以,如果我所做的只是将它们传递给某个函数,我仍然更喜欢用 constexpr const char[] 声明全局字符串常量。正如@HolyBlackCat 在评论中提到的,C++17 std::string_view 也使这个用例过时了,尤其是使用新的 sv 文字:

    #include <string_view>
    using namespace std::literals;
    //Compile-time string_view
    constexpr auto str = "hello"sv;
    
  2. const char* 更通用一些。您可以将其传递给接受 const char*std::stringstd::string_view 的函数。反过来需要 std::string::c_str(),如果不复制 std::string_view,这是不可能的。

  3. 不涉及动态分配。尽管 std::string 可能会使用 SSO,但不能保证。这可能与非常小的系统相关,其中堆很宝贵,程序闪存更适合并且无论如何都包含文字。

  4. 与旧图书馆互动。但即便如此,std::string 也以空值结尾。

总的来说,我的建议是使用 std::string_view 一有机会就使用 - 对于任何非拥有字符串,包括保存字符串文字。最重要的是,它应该替换 const char*const std::string& 函数参数。如果您想拥有一个字符串,请使用 std::string

,

使用 char 数组的一个原因(我个人认为这不是一个很好的原因)是您希望代码同时使用 C 编译器和 C++ 编译器编译的用例。