C++ 为什么在#include<;之后仍然需要使用std::string;字符串>;?

C++ 为什么在#include<;之后仍然需要使用std::string;字符串>;?,c++,string,include,using,C++,String,Include,Using,为了使用字符串,我需要包含字符串头,以便它的实现变得可用。但是如果是这样,为什么我仍然需要使用std::string添加行 为什么它还不知道字符串数据类型 #include <string> using std::string; int main() { string s1; } #包括 使用std::string; int main(){ 字符串s1; } 因为字符串是在名为std的命名空间中定义的 您可以在包含的任何地方编写std::string,但您可以使用std

为了使用字符串,我需要包含字符串头,以便它的实现变得可用。但是如果是这样,为什么我仍然需要使用std::string添加行

为什么它还不知道字符串数据类型

#include <string>

using std::string;

int main() {
    string s1;
}
#包括
使用std::string;
int main(){
字符串s1;
}

因为
字符串
是在名为
std
的命名空间中定义的

您可以在包含
的任何地方编写
std::string
,但您可以使用std::string
添加
,并且不在范围中使用命名空间(因此
std::string
可能被称为
string
)。例如,您可以将其放置在函数中,然后仅应用于该函数:

#include <string>

void foo() {
    using std::string;

    string a; //OK
}

void bar() {
    std::string b; //OK
    string c; //ERROR: identifier "string" is undefined
}
#包括
void foo(){
使用std::string;
字符串a;//确定
}
空条(){
std::字符串b;//确定
字符串c;//错误:标识符“string”未定义
}

因为
字符串
是在名为
std
的命名空间中定义的

您可以在包含
的任何地方编写
std::string
,但您可以使用std::string
添加
,并且不在范围中使用命名空间(因此
std::string
可能被称为
string
)。例如,您可以将其放置在函数中,然后仅应用于该函数:

#include <string>

void foo() {
    using std::string;

    string a; //OK
}

void bar() {
    std::string b; //OK
    string c; //ERROR: identifier "string" is undefined
}
#包括
void foo(){
使用std::string;
字符串a;//确定
}
空条(){
std::字符串b;//确定
字符串c;//错误:标识符“string”未定义
}

>P> <代码>命名空间< /C>是C++的一个附加特性,它定义变量、函数或对象的范围,避免名称冲突。这里,
string
对象在
std
名称空间中定义

std
是标准名称空间
cout
cin
string
以及许多其他内容都在其中定义


标题>代码> <代码>声明与字符串库相关的各种实体,而命名空间用于分组相关功能,并允许在不同命名空间中使用相同名称。

<代码>命名空间< /C> >是C++的另一个特性,它定义变量的范围,函数或对象,避免名称冲突。这里,
string
对象在
std
名称空间中定义

std
是标准名称空间
cout
cin
string
以及许多其他内容都在其中定义


标题
声明了与字符串库相关的各种实体,而名称空间用于对相关功能进行分组,并允许在不同的名称空间中使用相同的名称。

因为类
字符串
的声明位于名称空间std中。因此,您需要始终通过std::string访问它(那么你就不需要有using)或者像你做的那样去做。

因为class
string
的声明在名称空间std中。因此你要么总是需要通过std::string访问它(那么你就不需要有using)或者像以前那样做。

使用std::string;
并不意味着您现在可以使用此类型,但您可以使用此类型,而无需在类型名称之前指定命名空间
std::

以下代码是正确的:

#include <string>

int main()
{
    std::string s1;
    return 0;
}
#包括
int main()
{
std::字符串s1;
返回0;
}

使用std::string;
并不意味着您现在可以使用此类型,但您可以使用此类型,而无需在类型名称之前指定命名空间
std::

以下代码是正确的:

#include <string>

int main()
{
    std::string s1;
    return 0;
}
#包括
int main()
{
std::字符串s1;
返回0;
}

使用namespace std划一行并直接使用字符串,这不是一种糟糕的做法吗?我尝试只对我需要的东西使用
使用
。@vanmarcke这是一种糟糕的做法,你使用得对。@vanmarcke了解为什么
使用namespace std
是一种糟糕的做法:但在此之前,你必须阅读有关namespace的内容(请参阅mpiatek的答案)使用namespace std并直接使用字符串是不是不好的做法?我试着只对我需要的东西使用
使用
。@vanmarcke这是一个不好的做法,你用对了。@vanmarcke了解为什么
使用namespace std
是一个不好的做法:但在此之前,你必须阅读有关namespace的内容(请参阅mpiatek的答案)那么字符串没有在字符串头中定义?@vanmarcke它是在std名称空间的字符串头中定义的。请查看我答案末尾的链接。那么字符串头中没有定义?@vanmarcke它是在std名称空间的字符串头中定义的。请查看我答案末尾的链接。