何时应该在字符数组上使用std :: string?

vmr*_*rob 33 c++ string character-arrays

当我设计类接口时,我坐在那里思考是否应该使用const char*const std::string&经常使用它,当它归结为它时,我常常觉得一只手中有6只,另一只手拿着半打.

采用以下两个函数原型:

void foo(const char* str);
void foo(std::string str);
Run Code Online (Sandbox Code Playgroud)

如果foo函数是存储字符串,我会说第二个是更好的选择,因为能够传递字符串并尽可能利用移动语义.但是,如果foo只需要读取字符串,const char*解决方案会更好吗?

从性能角度来看,std::string不需要创建临时的.但是,使用已经存在的字符串作为参数调用该函数看起来很突出:foo(mystr.c_str()).更糟糕的是,如果需要在未来的某个时刻对阵列进行更高级的操作,或者如果应该存储副本,则接口必须进行更改.

所以我的问题是:

是否有明确的定义,无论是个人的还是其他的,约定何时std::string或是const char*更好的选择?此外,在开始一个新项目时,最好是与使用保持一致,还是只考虑最适合当前代码块的哪一个?

Rei*_*ica 52

const char*是C的回归.我会说,在体面的C++中,关于它的唯一用途是在extern "C"API中.

std::string 有许多优点:

  1. 它提供恒定时间size()功能.发现const char*线性时间的长度.

  2. 保证有效.const char*必须检查A 是否为空,并且完全可以传递不正确的数据 - 缺少空终止符的数据.这种情况几乎可以保证导致崩溃或更糟.

  3. 它与标准算法兼容.

如果您担心必须创建std::string调用函数的性能影响,请考虑采用标准库使用的方法 - 更改函数以取代一对迭代器.然后,您可以提供一个方便的重载,将const std::string&委托给迭代器对.

  • `string`在这里也更好.比较`myFunc(const char*)`和`myFunc(string)`. (2认同)
  • @DarkWanderer你的意思是`myFunc(std :: string)`. (2认同)

Fer*_*eak 20

只是个人经验中的一些注释.如果您正在处理一个c ++项目(根据您添加的标记)std::string尽可能多地坚持提供.不要试图重新发明所有结构中最基本的结构,即全能的字符串.我看到几个项目,他们重新发明了基本的字符串,然后花了几个月微调它.

如果您的c ++项目从您引入char*变量的那一刻开始,您就会回退到标准的C函数,例如strlen()strcpy(仅命名为两个......).从这一点开始,你的项目开始变得混乱,手动管理内存分配等......

如果你需要与接受const char*作为参数的第三方库进行交互(我认为你信任这些库 - 即:你相信他们不会const_cast用你那可怜的字符串来消除常量)你可以用它std::string::c_str()来解决const char*问题你的字符串.

如果您需要与接受方法的库进行交互,char*我强烈建议您复制字符串c_str()并将其用作库的输入参数(当然,不要忘记删除额外的副本).

除了这些额外的分数,我只赞同Angew的回应中的所有三点.


Abh*_*sal 6

std::string应始终是c ++的首选.为了避免额外的复制开销,您应该尽可能地将参数作为参考和const参考传递.

在这种情况下,您的函数签名将变为这样

void foo(std :: string&str);

如果参数是const,那就像这样

void foo(const std :: string&str);

你可以在这里查看这个const关键词的好处

  • 不,在C++ 11中,如果你需要复制字符串,你应该传递值而不是const引用. (6认同)