C++ std::string 和字符串

Posted

技术标签:

【中文标题】C++ std::string 和字符串【英文标题】:C++ std::string and string 【发布时间】:2011-09-29 20:05:56 【问题描述】:

我想没有人告诉我在 C++ 中使用 std::string 和仅使用字符串数据类型有什么区别??

在什么情况下应该使用std::string而不是标准字符串??

谢谢。

【问题讨论】:

什么标准的字符串数据类型?你在说char *吗? 我的意思是字符串本身。就像当我声明一个变量'字符串名称'时......如果这有任何意义吗? :S 【参考方案1】:

它们都是同一类型。 std::string 指定命名空间,而 string 仅在使用 using namespace std;using std::string 语句时才有意义。所以你使用什么没有任何区别(只要你保持一致)。

如果您谈论的是字符串文字(例如"hello"),那么它们的类型是const char [],隐式衰减为const char *std::string 有一个非explicit 构造函数,它采用const char *,这允许从const char *std::string 的隐式转换。可以使用std::string::c_str()方法进行相反的操作。

如果您正在寻找使用std::string 而不是const char * 的理由,那么我想我的答案是“尽可能多地”。

【讨论】:

从技术上讲,字符串文字 "hello" 的类型为 const char[6]【参考方案2】:

这些在您的程序中可能是相同的。 “标准”字符串位于“std”命名空间中。如果您“使用 std::string;”或“使用命名空间标准;”在模块内,它们是等价的。如果您没有指定“使用”语句,则需要提供对象的命名空间。最好不要在头文件中提供“使用”语句,因此您通常会在对象上看到命名空间解析/说明符。 (即 std::vector、mynamespace::myclass 等)。 “using”的使用在实现文件中更常见,它们不会像在头文件中指定的那样影响其他文件。

可以使用来自其他提供者的字符串对象。在这种情况下,提供者应该/应该在他们自己的命名空间中实现他们的字符串对象,并且您需要声明您正在使用哪个字符串对象。

所以:

File: stdString.cpp
-------------
#include <string>
#include "providerx/string.h"

using namespace std;

void foo()

   string x;          // Using string object provided by the C++ standard library
   std::string y;     // Again, using C++ standard lib string
   providerx::string  // Using string object defined within the providerx namespace





File: providerString.cpp
-------------------
#include "providerx/string.h"

using providerX::string;

void foo()

    string x;   // Using providerx string object

【讨论】:

我喜欢每种形式何时合适的解释!【参考方案3】:

很可能,您的代码中有using namespace std。这允许您在不解析范围的情况下访问 std 命名空间的成员。所以……

std::string == 字符串

【讨论】:

以上是关于C++ std::string 和字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中搜索 std::string 中的子字符串?

如何在 C++ 中将整个文件读入 std::string?

将 System::String^ (C# 字符串)转换为 C++ std::string [重复]

从无符号字符到 std::string 的 C++ 转换 [重复]

在 C++ 中定义 std::string 没有转义字符

C++ std::string 构造函数