在C ++中将字符串声明为std:string

时间:2013-04-20 12:36:07

标签: c++ string private-members

这是基于GCC / G ++,通常是在Ubuntu上。

这是我完成的示例程序:

#include <iostream>

using namespace std;

int main()
{

std::string c = "Test";
cout << c;
return 0;
}

上面的代码工作正常。

但我有两个问题我不太明白......

  1. 将字符串声明写为std:string也可以正常工作。有什么区别。

  2. 如果我在一个类中使用此std::string来声明私有变量,则会出现错误错误:'std'未命名类型。本声明的示例:

  3. class KType
    {
    private:
      std:string N;
    

    有人可以解释一下这些问题吗? 非常感谢!

4 个答案:

答案 0 :(得分:12)

  

将字符串声明写为std:string也可以正常工作。有什么区别。

如果你采用不同的格式,差异会更加清晰:

std:
    string c = "Test";

您声明了一个名为std标签,并使用string转储到全局命名空间中的名称using namespace std;。正确地将其写为std::string,您正在使用string命名空间中的std名称。

  

如果我在一个类中使用此std::string来声明私有变量,则会出现错误错误:‘std’ does not name a type.

那是因为你不能在类定义中添加标签,只能在代码块中。您必须在std::string处正确编写它。 (如果在标题中定义了类,那么using namespace std比源文件更糟糕,所以我建议你不要这样做。)

此外,如果您使用的是std::string,那么您应#include <string>。由于<iostream>引入的定义超出了所需的定义,您的代码看起来很偶然,但您无法依赖它。

答案 1 :(得分:5)

您需要包含字符串类标题:

#include <string>

此代码有拼写错误,缺少第二个冒号

std:string N;

应该是:

std::string N;

使用单个冒号,它会变成goto的标签,这可能不是你的意思。

答案 2 :(得分:3)

第一个问题:

首先,您缺少#include <string>指令。您不能自动依赖其他标头(例如<iostream>)到#include <string>标头。除此之外:

第二个问题:

  

将字符串声明写为std:string也可以正常工作。有什么区别。

这是因为你在全局命名空间范围内有一个(邪恶的)using指令:

using namespace std;

该指令的作用是将std命名空间中的所有名称导入到全局命名空间中。这就是完全限定的std::string和不合格string解析为同一类型的原因。

如果省略了using namespace std;指令,则在使用非限定string名称时会出现编译错误。

第三个问题:

  

如果我在一个类中使用这个std :: string来声明一个私有变量,我会收到一个错误错误:'std'没有命名一个类型。此声明的示例:

你错过了冒号。那应该是:

std::string
//  ^

而不是

std:string
// ^

答案 3 :(得分:2)

  

将字符串声明写为std:string也可以正常工作。有什么区别。

除非您声明名为string的其他内容,否则没有区别。在您的代码中,stringstd::string指的是相同的类型。但不惜一切代价避免using namespace std

  

如果我在一个类中使用这个std :: string来声明一个私有变量,我会收到一个错误错误:'std'没有命名一个类型。此声明的示例:

您需要#include <string>才能使用std::string。发生的事情是,在您的第一个代码示例中,<iostream>似乎包括<string>。你不能依赖它。您必须包含<string>