std::cout以及std::cin。是使用系统定义的cout和cin方法且仅使用这两个方法,using namespace std则是将所有的系统定义的标识符导入,也就是说你自己定义的东西(变量,方法,类等)不能和系统中的这些标识符重名,否则将出现命名冲突的错误!
所谓namespace,是指标识符的各种可见范围。
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:
std::cout << std::hex << 3.4 << std::endl;
2、使用using关键字。
using std::cout;
using std::endl;
using std::cin;
以上程序可以写成
cout << std::hex << 3.4 << endl;
3、最方便的就是使用using namespace std;
例如:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:
cout << hex << 3.4 << endl;
因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准 库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。
增大了命名空间范围,容易引起重名问题,例如下面这个程序:
#include<iostream>
using namespace std;
class distance
{
private:
int a;
public:
distance():a(10){}
distance(int x)
{
a=x;
}
void print()
{
cout<<"\n a = "<<a<<" \n ";
}
distance operator *(distance);
};
distance distance :: operator *(distance d)
{
a=a*d.a;
return distance(a);
}
int main()
{
distance d1,d2,d3;
d1.print();
d2.print();
d3.print();
d3=d1 * d2;
d3.print();
return 0;
}
会产生编译错误:
'distance' : ambiguous symbol.
原因就是distance也是在标准模板函数的名称库。
所以,您可以使用::范围运算符来引用你自己的名字或您可以更改您的类的名称。
可以使用诸如这样的方式
using namespace xxoo
{
class A
{
......
}
}
这样的话,之后你在括号里面书写的类才用到了所需要的命名空间。
其实这种说法和性能无关的。
很多时候使用using namespace std;要么是因为偷懒,要么是使用std中的函数命名比较多,一一列举麻烦。但的确容易引起命名冲突,此时就不能再后面再使用std::cout这样的命名了。
如果用到的命名少,最好还是单独列举如 std::cout以及std::cin。
namespace 的引入是为了解决名字冲突的问题,而 using namespace... 的引入是为了方便程序员,使其不用每次都输入长长的名字。这些都跟性能无关。
通常不建议在头文件中使用 using namespace xxx 语句,不仅是对 std。如果头文件 a.h 使用了该语句,所有直接或间接包含 a.h 的文件都隐式使用了该语句,这会很容易导致名字冲突。
在实现文件中使用则一般不会出现问题。而且,即使出现问题,也局限于使用了该语句的单个实现文件。
头文件里面不要加using namespace std;要不然引用你的头文件的都被迫using了。其他cpp里面其实用了就用了吧,编译不出问题就没事……C++库的类型名基本都是小写,只需要注意你的变量名尽量不要使用可能重复的那些就行。
所谓namespace,是指标识符的各种可见范围。
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:
std::cout << std::hex << 3.4 << std::endl;
2、使用using关键字。
using std::cout;
using std::endl;
using std::cin;
以上程序可以写成
cout << std::hex << 3.4 << endl;
3、最方便的就是使用using namespace std;
例如:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:
cout << hex << 3.4 << endl;
因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准 库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。
增大了命名空间范围,容易引起重名问题,例如下面这个程序:
#include<iostream>
using namespace std;
class distance
{
private:
int a;
public:
distance():a(10){}
distance(int x)
{
a=x;
}
void print()
{
cout<<"\n a = "<<a<<" \n ";
}
distance operator *(distance);
};
distance distance :: operator *(distance d)
{
a=a*d.a;
return distance(a);
}
int main()
{
distance d1,d2,d3;
d1.print();
d2.print();
d3.print();
d3=d1 * d2;
d3.print();
return 0;
}
会产生编译错误:
'distance' : ambiguous symbol.
原因就是distance也是在标准模板函数的名称库。
所以,您可以使用::范围运算符来引用你自己的名字或您可以更改您的类的名称。
可以使用诸如这样的方式
using namespace xxoo
{
class A
{
......
}
}
这样的话,之后你在括号里面书写的类才用到了所需要的命名空间。
其实这种说法和性能无关的。
很多时候使用using namespace std;要么是因为偷懒,要么是使用std中的函数命名比较多,一一列举麻烦。但的确容易引起命名冲突,此时就不能再后面再使用std::cout这样的命名了。
如果用到的命名少,最好还是单独列举如 std::cout以及std::cin。
namespace 的引入是为了解决名字冲突的问题,而 using namespace... 的引入是为了方便程序员,使其不用每次都输入长长的名字。这些都跟性能无关。
通常不建议在头文件中使用 using namespace xxx 语句,不仅是对 std。如果头文件 a.h 使用了该语句,所有直接或间接包含 a.h 的文件都隐式使用了该语句,这会很容易导致名字冲突。
在实现文件中使用则一般不会出现问题。而且,即使出现问题,也局限于使用了该语句的单个实现文件。
头文件里面不要加using namespace std;要不然引用你的头文件的都被迫using了。其他cpp里面其实用了就用了吧,编译不出问题就没事……C++库的类型名基本都是小写,只需要注意你的变量名尽量不要使用可能重复的那些就行。
本文详细介绍了C++中的命名空间(namespace)概念及其使用方式,包括如何避免命名冲突,并探讨了不同使用场景下的最佳实践。
610

被折叠的 条评论
为什么被折叠?



