首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++中string和char[]类型的区别

C++中string和char[]类型的区别
EN

Stack Overflow用户
提问于 2009-08-17 10:52:35
回答 5查看 255.5K关注 0票数 145

我懂一点C,现在我来看看C++。我习惯于使用char数组来处理C字符串,但是当我查看C++代码时,我发现有同时使用string类型和char数组的示例:

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;

int main () {
  string mystr;
  cout << "What's your name? ";
  getline (cin, mystr);
  cout << "Hello " << mystr << ".\n";
  cout << "What is your favorite team? ";
  getline (cin, mystr);
  cout << "I like " << mystr << " too!\n";
  return 0;
}

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main () {
  char name[256], title[256];

  cout << "Enter your name: ";
  cin.getline (name,256);

  cout << "Enter your favourite movie: ";
  cin.getline (title,256);

  cout << name << "'s favourite movie is " << title;

  return 0;
}

(两个例子都来自http://www.cplusplus.com)

我想这是一个被广泛询问和回答的问题(很明显?)如果有人能告诉我这两种在C++中处理字符串的方式(性能,应用编程接口集成,每种方式都更好,等等)之间到底有什么区别,那就太好了。

谢谢。

EN

回答 5

Stack Overflow用户

发布于 2009-08-17 10:54:28

嗯,string type是一个完全托管的字符串类,而char[]仍然是它在C中的样子,一个字节数组为您表示一个字符串。

就API和标准库而言,所有的东西都是以字符串的形式实现的,而不是char[],但是libc仍然有很多接收char[]的函数,所以你可能需要使用它,除此之外,我总是使用std::string。

当然,就效率而言,非托管内存的原始缓冲区对于许多事情几乎总是更快,但考虑到比较字符串,例如,std::string的大小总是可以首先进行检查,而使用char[]时,您需要逐个字符地进行比较。

票数 7
EN

Stack Overflow用户

发布于 2009-08-17 11:04:05

我个人认为,除了与旧代码的兼容性之外,没有任何理由要使用char*或char[]。std::string并不比使用c-string慢,只是它将为您处理重新分配。你可以在创建它的时候设置它的大小,这样就可以避免重新分配。它的索引运算符([])提供恒定的时间访问(在这个词的任何意义上都与使用c-string索引器完全相同)。使用at方法也为您提供了边界检查的安全性,这是使用c-string无法获得的,除非您编写它。您的编译器通常会在发布模式下优化索引器的使用。处理c-string很容易;比如delete vs delete[],异常安全,甚至如何重新分配c-string。

当您必须处理高级概念时,例如使用COW字符串,以及用于MT的非COW等,您将需要std::string。

如果你担心拷贝,只要你尽可能地使用引用和常量引用,你就不会因为拷贝而产生任何开销,这和你使用c-string做的事情是一样的。

票数 5
EN

Stack Overflow用户

发布于 2016-03-10 03:20:56

可以将(char *)看作string.begin()。本质区别在于(char *)是迭代器,而std::string是容器。如果您坚持使用基本字符串,a (char *)将提供std::string::iterator所做的事情。你可以使用(char *),当你想要一个迭代器的好处和与C的兼容性,但这是一个例外,而不是规则。和往常一样,要小心迭代器的失效。当人们说(char *)不安全时,这就是他们的意思。它和其他任何C++迭代器一样安全。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1287306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档