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

Declaring strings as std:string in C++

本文关键字:std string 声明 字符串 c++      更新时间:2023-10-16

这是基于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 '没有命名类型。声明的示例:

class KType
{
private:
    std:string N;
};
谁能解释一下这些问题?很多谢谢!

将string声明写成std:string也可以。有什么不同?

如果你对它进行不同的格式化,区别会稍微清晰一些:

std:
    string c = "Test";

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

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

这是因为你不能把标签放在类定义中,只能放在代码块中。你必须把它正确地写为std::string。(如果类是在头文件中定义的,那么using namespace std是一个比在源文件中更糟糕的主意,所以我强烈建议您不要这样做。)

同样,如果你正在使用std::string,那么你应该使用#include <string>。看起来你的代码工作是偶然的,因为<iostream>拉入了比它需要的更多的定义,但你不能移植依赖于这一点。

您需要包含字符串类头:

#include <string>

这段代码有一个错别字,缺少第二个冒号

std:string N;
应:

std::string N;

加上一个冒号,它就变成了goto的标签,这可能不是您的意思。

第一个问题:

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

第二个问题:

将string声明写成std:string也可以。有什么不同?

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

using namespace std;

这个指令的效果是所有来自std命名空间的名字都被导入到全局命名空间中。这就是为什么完全限定的std::string和不限定的string解析为相同的类型。

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

第三个问题:

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

您缺少一个冒号。应该是:

std::string
//  ^

std:string
// ^

将string声明写成std:string也可以。有什么不同?

没有区别,除非你声明了另一个叫做string的东西。在您的代码中,stringstd::string引用同一类型。但要不惜一切代价避免using namespace std

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

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