c++ - 在下面的这种情况下,是否有任何理由从使用 const char* 更改为 string
问题描述
std::string
我知道,与使用指针相比,总是建议使用它const char *
,因为使用指针可能会发生无意的变化。但是对于不会被任何其他工程师无意更改的简单用法,这仍然是一个大问题。例如,请参见下面的代码 -
所以在下面这个例子中,我可以使用
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;
}
解决方案
您的用户可能会在外部指定用户名和密码,这将在string
. 所以没有理由不string
从一开始就使用 a 。这个例子的双字符串创建工件可能不是真实世界或生产案例(至少我希望它不是……)。
在现代 C++(C++17 后)中,没有充分的理由再const char*
在新代码中使用,您应该string_view
改用。这有效地替换了指针,因为它具有字符串的大小,并且还可以有效地切片字符串的位。它不适合最终存储在字符串中的东西。在这种情况下,您应该string
从一开始就使用 a。
所以有两种用例,一种适合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;
}
推荐阅读
- sql - 如何使用 ORACLE REGEX 函数删除所有前导和尾随换行符和空格?
- bazel - 使用 strategy_regexp 进行 TestRunner 操作?
- javascript - 一种更好的方法来遍历一组项目
- oracle - SQL 开发人员:侦听器拒绝连接
- sass - sassOptions 中的 data 选项在升级到 v3 并用 sass 替换 node-sass 后停止在 gatsby-plugin-sass 中工作
- visual-studio-code - 机器人框架中 Python 关键字的 Intellisense 在 VS Code 中不起作用
- javascript - 在数组中的特定过滤器之后添加对象的总和
- android - Android Talkback 公告中断
- python - 网络上看不到 Pi 上的默认 CKAN 2.9 安装
- php - laravel Blade 中没有任何输出,请找出我的错误。我不知道会发生什么