福田网站建设哪家好怎么推广网页
假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。
同样的情况也出现在 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。
因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。
关于命名空间内变量和函数及全局变量的使用和作用域:
#include <iostream>
using namespace std;
namespace A
{int a = 100;namespace B //嵌套一个命名空间B{int a =20;}
}int a = 200;//定义一个全局变量int main(int argc, char *argv[])
{cout <<"A::a ="<< A::a << endl;cout <<"A::B::a ="<<A::B::a << endl;cout <<"a ="<<a << endl;cout <<"::a ="<<::a << endl;int a = 30;cout <<"a ="<<a << endl;cout <<"::a ="<<::a << endl;return 0;
}
结果:
A::a =100
A::B::a =20
a =200 //全局变量a
::a =200
a =30 //局部变量a
::a =200
即:全局变量 a 表达为 ::a,用于当有同名的局部变量时来区别两者。
补充关于 using 的错误事例:
#include <iostream>
using namespace std;
namespace A
{int a = 100;int fun(){cout<<"a = "<<a<<endl;}namespace B //嵌套一个命名空间B{int a =20;int fun(){cout<<"a = "<<a<<endl;}}
}int main(int argc, char *argv[])
{cout<<a<<endl;fun();return 0;
}
这样会出错:会显示 a 变量和 fun 函数 “was not declared in this scope”,即找不到这个 a 和 fun 函数。
解决办法: 用 using 来告诉编译器用到的是哪个命名空间内的内容。在 main() 上面加 using namespace A; 或者 using namespace A::B; 。这样就可以使用其中的 a 和 fun()。但是不能同时使用,因为这样也会导致编译出错,编译器器不知道要去使用哪个 a 和 fun()。
补充一个命名空间冲突的情况:
#include <iostream>using namespace std;
namespace A {int a = 100;namespace B //嵌套一个命名空间B{int a = 20;}
}int a = 200;//定义一个全局变量int main(int argc, char *argv[]) {cout << "A::a =" << A::a << endl; //A::a =100cout << "A::B::a =" << A::B::a << endl; //A::B::a =20cout << "a =" << a << endl; //a =200cout << "::a =" << ::a << endl; //::a =200using namespace A;cout << "a =" << a << endl; // Reference to 'a' is ambiguous // 命名空间冲突,编译期错误cout << "::a =" << ::a << endl; //::a =200int a = 30;cout << "a =" << a << endl; //a =30cout << "::a =" << ::a << endl; //::a =200//即:全局变量 a 表达为 ::a,用于当有同名的局部变量时来区别两者。using namespace A;cout << "a =" << a << endl; // a =30 // 当有本地同名变量后,优先使用本地,冲突解除cout << "::a =" << ::a << endl; //::a =200return 0;
}