C++:我应该使用字符串或字符数组吗?

phy*_*ael 15 c c++ string char

我对C和C++中程序员编码方式的基本方式有点模糊.特别一件事是在C++中使用字符串而不是字符数组,反之亦然.那么,我应该使用字符串或字符数组,一般来说,为什么?

Jam*_*lis 27

在C++中,几乎在所有情况下都应该使用std::string而不是原始char数组.

std::string 为您管理底层内存,这本身就是一个很好的理由来选择它.

它还为常见的字符串操作提供了易于使用和更易读的界面,例如,相等性测试,连接,子字符串操作,搜索和迭代.

  • 易用性是我的首要原因. (5认同)
  • 你可以提到主要的例外是与现有的C库接口,即使那些只需要输入的例子也可以从your_string.c_str()获取一个const char* (4认同)

Ben*_*igt 12

如果您正在修改或返回字符串,请使用std::string.如果没有,请接受您的参数作为a,const char*除非您绝对需要std::string成员函数.这使您的函数不仅可以使用std::string::c_str(),还可以使用字符串文字.为什么让你的调用者付出构建std::string堆存储的代价来传递文字?

  • `string`不能从`char*`转换.`string`可以从`char*`构造,并导致堆分配和碎片.(除非你对我的答案的最后一句话做出回应,否则请不要downvote.)反之,使用`c_str()`成员函数(我在回答中已经提到过)就可以了.指针既不是为了向后兼容,也不是为了保持单个值.恰恰相反,它们构建了很好的迭代器,并且所有标准库算法都经过精心设计,以便在迭代器是指针时正常工作. (5认同)
  • @Ben:+1我喜欢这个想法,虽然我没有看到它在实践中用得太多.我想这取决于你最终如何使用字符串.从技术上讲,`string` _is_ convertible来自`char*`:非显式的单参数构造函数是"转换构造函数",属于用户定义的转换类别.当然,这并不意味着称它便宜. (3认同)
  • 伙计们,哇,你在这里处理过早优化._All_适当的函数将通过const引用获取一个字符串,除非它们需要它的副本(在这种情况下,你不会通过使用`char*`来保存任何东西).因此,你不要通过使用`char*`来获得性能.当你需要一个字符串时,_no_有理由使用`char*` - 除非您的原始字符串被固定在堆栈上或编译进去,并且分析器说它们应该是这样的.如果探查器没有说同样的话,建议在`字符串`上使用`char*`大概不是一个好建议. (3认同)
  • @wilhelmtell:通过const引用获取字符串不会阻止您必须构造临时字符串对象以传递字符串文字.我认为这听起来像是一种合理,简单,非侵入性,不可读性的"过早"优化. (3认同)
  • 实际上,`const char*`不仅可以指向没有转换的文字,还可以指向`std :: vector`,进入`std :: string`的中间,从文字初始化的全局指针或输入参数在我写的软件中,几乎所有字符串的使用都属于这些类别之一.本地化的比例会更少,但不会那么少.参数解析没有得到本地化,日志文件和错误代码也没有(在任何理智的系统中).对于搜索引擎,即使错误消息应该本地化也是一个折腾. (2认同)