C++ C++;:是";“我的文本”;std::string、*char还是c-string?

C++ C++;:是";“我的文本”;std::string、*char还是c-string?,c++,string,char,C++,String,Char,我刚才所做的似乎是: 首先我们读到的是这样的: #include <fstream> int main() { using namespace std; ifstream inf("file.txt"); // (...) } #包括 int main(){ 使用名称空间std; ifstream-inf(“file.txt”); // (...) } 其次,我们尝试在代码中使用类似的内容,如下所示: #include <f

我刚才所做的似乎是:

首先我们读到的是这样的:

 #include <fstream>
 int main() {
      using namespace std;
      ifstream inf("file.txt");
      // (...)
 }  
#包括
int main(){
使用名称空间std;
ifstream-inf(“file.txt”);
// (...)
}  
其次,我们尝试在代码中使用类似的内容,如下所示:

#include <fstream>
int main() {
    using namespace std;
    std::string file = "file.txt"; // Or get the name of the file 
                                   // from a function that returns std::string.
    ifstream inf(file);
    // (...)
}
#包括
int main(){
使用名称空间std;
std::string file=“file.txt”;//或获取文件名
//从返回std::string的函数。
ifstream-inf(文件);
// (...)
}
第三,新手开发人员被一些神秘的编译器错误消息所困扰

问题是将
const*char
作为构造函数参数

问题是

现在,真正的问题是,对于新手来说,几乎所有教程中给出的“file.txt”或类似示例看起来都很像std::string

那么,“我的文本”是std::string、c-string还是*char,还是取决于上下文

你能举例说明“我的文本”如何根据上下文进行不同的解释吗

[编辑:我认为上面的例子会让它变得明显,但我应该更明确:我的意思是包含在双引号内的任何字符串的类型,即“myfilename.txt”,而不是“string”一词的含义。]

谢谢

那么,“string”是
std::string
、c-string还是
char*
,还是取决于上下文

这完全取决于上下文。:-)欢迎使用C++。 C字符串是以null结尾的字符串,它几乎总是与
char*
相同

根据您使用的平台和框架,单词“string”可能有更多的含义(例如,它也用于在Qt中指
QString
,或在MFC中指
CString

=
的右侧包含一个(原始)字符串文字(即以null结尾的字节字符串)。它的有效类型是常量字符的
数组

这里的
=
是一匹狡猾的小马:没有分配任务。
std::string
类有一个构造函数,该构造函数将指向char的指针作为参数,调用该构造函数可创建一个临时
std::string
,该构造函数用于复制
std::string
类型的对象
文件

不过,编译器可以自由地省略复制ctor并直接实例化文件

但是,请注意,
std:string
与以C样式null结尾的字符串不同。它甚至不需要以null结尾

ifstream inf("file.txt");
std::ifstream
类有一个接受
const char*
的ctor,传递给它的字符串文字衰减为指向字符串第一个元素的指针


需要记住的是:
std::string
提供了C风格字符串的(几乎无缝)转换。您必须查找函数的签名,以查看是否在<代码> const char */COD>或<代码> STD::String >(后者是隐式转换)。C++标准库提供了一个STD:String类来管理和表示字符序列。它封装了内存管理,大多数情况下是作为C字符串实现的;但这是一个实现细节。它还为常见任务提供操作例程

std::string类型始终是这样的(例如,它没有到char*的转换运算符,这就是为什么有c_str()方法),但它可以由c-string(char*)初始化或分配


另一方面,如果有一个函数采用std::string或const std::string&作为参数,则可以向该函数传递一个c-string(char*),编译器将为您构建一个std::string。根据您所说的上下文,这将是一种不同的解释。

它应该尽可能多地表示
std::string
(如果您使用的是提供这种功能的框架,也可以使用类似的替代方法,如
wxString
QString
等。有时您除了使用以NUL结尾的字节序列外别无选择,但通常希望尽可能避免使用它

归根结底,根本没有明确、明确的术语。这就是生活

那么,“string”是std::string、c-string还是*char,还是取决于上下文

    <> L> C和C++都没有内置的字符串数据类型,所以代码中的任何双引号字符串基本上是代码> conchchar */COD>(或<代码> const char []/COD>精确)。“C字符串”通常指的是这个,特别是一个带有null终止符的字符数组。
  • C++中,<>代码> STD::String 是一个将一个原始字符串封装到一个对象中的便利类。通过使用它,您可以避免自己做(杂乱)指针算术和内存重新分配。
  • 大多数标准库函数仍然只接受
    char*
    (或
    const char*
    )参数
  • 您可以将
    char*
    隐式转换为
    std::string
    ,因为后者有一个构造函数来完成此操作
  • 必须使用
    c_str()
    方法将
    std::string
    显式转换为
    const char*

感谢Clark Gaebel指出 const < P>使用适当的措辞(如C++语言标准中的发现)<强>字符串是STD::Basic字符串(包括STD::String)的第21.3章“String类”的变体之一(如C++中的0xN3092),而ifstream的构造函数的参数是NTBS(以Null结尾的字节序列)

引用C++0x N3092 27.9.1.4/2

基本文件打开(
ifstream inf("file.txt");
const char* v()
{
    char* text = “Hello”;
    return text;
    // Above code can be reduced to:
    // return “Hello”;
}
const char* v()
{
    char text[] = “Hello”;
    return text;
}