在下面的例子中,是否有任何理由从使用 const char* 更改为字符串

Is there any reason to change from using const char* to string in this case below

本文关键字:char const 字符串 理由 任何 是否 在下面      更新时间:2023-10-16

我知道,与const char *相比,始终建议使用std::string,因为使用指针可能会发生无意的更改。但是对于任何其他工程师不会有任何无意更改的简单用法,这仍然是一个大问题吗?例如,请参阅下面的代码 -

所以在下面的这个例子中,我本可以使用 std::string BothUserNameAndPassword = "abracadabra";

我看到有时不得不处理具有上述代码的代码审查。

#include<iostream>
using namespace std;
void authenticatePassword(std::string const & username, std::string 
const &password);
int main()
{
        const char* BothUserNameAndPassword = "abracadabra";        
        authenticatePassword(BothUserNameAndPassword, BothUserNameAndPassword);
}
void authenticatePassword(std::string const & username, std::string const &password)
{
        cout << "username = "<<username<<" and password = "<<password <<endl;
}

有什么理由从使用 const char* 更改为字符串 [...]?

是的,有。函数签名显示需要两个const std::string&参数。现在,如果传入const char*对象会发生什么情况?隐式构造临时std::string实例。通过与

const std::string BothUserNameAndPassword = "abracadabra";
authenticatePassword(BothUserNameAndPassword, BothUserNameAndPassword);

你不会付出额外的努力。我不认为这是一个对性能至关重要的调整,但它可能被认为更具可读性,因为在查看函数签名和传递给它的变量时,您不必考虑转换。

请注意,从 C++17 开始,您可能还需要考虑std::string_view这种情况(函数参数和将文本绑定到变量)。

您的用户可能会在外部指定用户名和密码,这将在string中读取。因此,没有理由从一开始就不使用string。此示例的双字符串创建工件可能不是现实世界或生产案例(至少我希望它不是......

在现代C++(C++17 后),没有充分的理由在新代码中使用const char*,您应该改用string_view。这有效地替换了指针,因为它具有字符串的大小,并且还可以有效地切片字符串的位。它不适合最终存储在字符串中的东西。在这种情况下,您应该从一开始就使用string

所以有两个用例,一个适合string,一个适合string_view

  • 存储数据
  • 使用数据

在这种特定情况下,我会做:

int main()
{
    constexpr std::string_view BothUserNameAndPassword = "abracadabra";
    authenticatePassword(BothUserNameAndPassword, BothUserNameAndPassword);
}
void authenticatePassword(std::string_view username, std::string_view password)
{
        cout << "username = "<<username<<" and password = "<<password <<endl;
}