在下面的例子中,是否有任何理由从使用 const char* 更改为字符串
Is there any reason to change from using const char* to string in this case below
我知道,与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;
}
- 在字符串函数中抛出'char const*'实例后调用的终止
- 双重标准?为什么只有 char* const&a = "bla" 的警告?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 为什么 const char* const & = 可以编译"hello"?
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何将std::wstring转换为char const[]
- "char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {"剂量是什么意思
- 使用提升对字符串进行标记化时,将令牌转换为 char* const* 时失败
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 将 std::vector<std::string> 转换为 const char* const*
- 引发"char const*"错误的实例后调用的终止
- 将const char * const参数成员分配给新值
- 从'const char**'到'char* const*'的转换无效
- 从 sub_match<常量字符 *>' 转换为'const char *const &'
- char*const和constchar*之间有什么区别?(重复-需要更多澄清)
- 使用工厂方法时编译器错误:无法转换"const std::p air<char* const
- HEVC 解码器端口 Android 警告:从 'signed char*' 到 'char const* 的转换无效*
- 如何从'char const*'中删除常量
- 'char const *str'作为模板参数
- 为什么不;t strlen(.)应为const char*const str,而不是const char*