为什么采用using namespace std不是一个好主意
std::cout以及std::cin。是使用系统定义的cout和cin方法且仅使用这两个方法,using namespace std则是将所有的系统定义的标识符导入,也就是说你自己定义的东西(变量,方法,类等)不能和系统中的这些标识符重名,否则将出现命名冲突的错误!
所谓namespace,是指标识符的各种可见范围。
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:
2、使用using关键字。
以上程序可以写成
3、最方便的就是使用using namespace std;
例如:
这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:
因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准 库中的一切都被放在名字空间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也是在标准模板函数的名称库。
所以,您可以使用::范围运算符来引用你自己的名字或您可以更改您的类的名称。