//自定义一个命名空间,可以解决变量重名的问题
1 #include <iostream> 2 using namespace std; 3 4 namespace myspace//自定义一个命名空间,可以解决变量重名的问题 5 { 6 int a(15); 7 } 8 9 void main() 10 { 11 int a(5); 12 13 std::cout << "a=" << a << std::endl;//main函数a 14 15 std::cout << "a=" << myspace::a << std::endl;//命名空间的a 16 17 system("pause"); 18 }
//自定义一个命名空间,可以解决函数重名的问题
1 #include <iostream> 2 using namespace std; 3 4 namespace myspace//自定义一个命名空间,可以解决变量重名的问题 5 { 6 void print() 7 { 8 std::cout << "hello" << std::endl; 9 } 10 } 11 12 void print() 13 { 14 std::cout << "world" << std::endl; 15 } 16 17 void main() 18 { 19 print(); 20 21 myspace::print(); 22 23 system("pause"); 24 }
//匿名命名空间,变量、函数可以直接调用
1 #include <iostream> 2 using namespace std; 3 4 namespace//匿名命名空间,变量、函数可以直接调用 5 { 6 int a(3); 7 8 void print() 9 { 10 std::cout << "hello" << std::endl; 11 } 12 } 13 14 void main() 15 { 16 std::cout << a << std::endl; 17 18 print(); 19 20 system("pause"); 21 }
//命名空间别名
1 #include <iostream> 2 using namespace std; 3 4 namespace run 5 { 6 int a(3); 7 8 char *str("hello"); 9 } 10 namespace r = run;//命名空间别名 11 12 void main() 13 { 14 std::cout << r::a << std::endl; 15 16 std::cout << r::str << std::endl; 17 18 system("pause"); 19 }
//使用了using namespace以后,调用命名空间成员可以不用写命名空间名称了
1 #include <iostream> 2 using namespace std; 3 4 namespace run 5 { 6 int a(3); 7 8 char *str("hello"); 9 } 10 using namespace run; 11 12 void main() 13 { 14 std::cout << a << std::endl;//使用了using namespace以后,调用命名空间成员可以不用写命名空间名称了 15 16 system("pause"); 17 }
//命名空间的嵌套
1 #include <iostream> 2 using namespace std; 3 4 namespace run 5 { 6 int a(3); 7 char *str("hello"); 8 9 namespace runrun//命名空间的嵌套 10 { 11 int a(9); 12 } 13 } 14 using namespace run; 15 16 void main() 17 { 18 std::cout << run::a << std::endl; 19 20 std::cout << run::runrun::a << std::endl;//命名空间的嵌套 21 22 system("pause"); 23 }
//命名空间的拓展
1 #include <iostream> 2 using namespace std; 3 4 namespace run 5 { 6 int a(3); 7 char *str("hello"); 8 } 9 using namespace run; 10 11 namespace run//命名空间的拓展 12 { 13 int y(5); 14 15 //int a(6);//error C2374: “run::a”: 重定义;多次初始化 16 } 17 18 void main() 19 { 20 std::cout << run::y << std::endl;//命名空间的拓展 21 22 system("pause"); 23 }
软件开发注意事项
//一般不要在命名空间内定义函数,而是定义一个函数指针,方便维护
1 #include <iostream> 2 using namespace std; 3 4 namespace run 5 { 6 int a(3); 7 int(*padd)(int, int);//函数指针,指向一个外部函数 8 9 } 10 using namespace run; 11 12 int add(int a, int b)//一般不要在命名空间内定义函数,而是定义一个函数指针,方便维护 13 { 14 return a + b;//今天客户只要求一个返回结果 15 } 16 17 int addp(int a, int b) 18 { 19 std::cout << a << " " << b << std::endl;//明天客户可能要求增加一个打印结果功能 20 return a + b; 21 } 22 23 void main() 24 { 25 std::cout << run::y << std::endl;//命名空间的拓展 26 27 system("pause"); 28 }
命名空间所有的数据,函数、类、对象都是公有的
命名空间是透明的,不允许定义private, public, protected
//命名空间内部可以有类
1 #include <iostream> 2 using namespace std; 3 4 namespace run 5 { 6 int a(3); 7 8 class myclass//命名空间内部可以有类 9 { 10 public: 11 int a; 12 }; 13 } 14 using namespace run; 15 16 void main() 17 { 18 19 system("pause"); 20 }
//using必须在命名空间的下方,作用域从此往下,仅在此源文件有效
1 #include <iostream> 2 using namespace std; 3 4 namespace mydata 5 { 6 int a(6); 7 } 8 using namespace mydata;//using必须在命名空间的下方,作用域从此往下,仅在此源文件有效 9 10 void go() 11 { 12 std::cout << a << std::endl; 13 } 14 15 void main() 16 { 17 go(); 18 19 system("pause"); 20 }
//如果2个命名空间的变量重名,会出现不明确错误,这是需要加上命名空间修饰符::
1 #include <iostream> 2 using namespace std; 3 4 namespace mydata 5 { 6 int a(6); 7 } 8 using namespace mydata; 9 10 namespace yourdata 11 { 12 int a(9); 13 } 14 using namespace yourdata; 15 16 void go() 17 { 18 std::cout << yourdata::a << std::endl;//如果2个命名空间的变量重名,会出现不明确错误,这是需要加上命名空间修饰符:: 19 } 20 21 void main() 22 { 23 go(); 24 25 system("pause"); 26 }
//using如果在块语句内容,作用域是定义开始到块语句结束
1 #include <iostream> 2 using namespace std; 3 4 namespace mydata 5 { 6 int a(6); 7 } 8 using namespace mydata; 9 10 void go() 11 { 12 using namespace mydata; 13 14 std::cout << a << std::endl;//using如果在块语句内容,作用域是定义开始到块语句结束 15 } 16 17 void main() 18 { 19 go(); 20 21 system("pause"); 22 }
//C出现全局变量和局部变量重命名时,无法引用全局变量
1 #include <iostream> 2 using namespace std; 3 4 int a = 1; 5 6 void main() 7 { 8 printf("%d ", a);//1 9 10 a = 3;//C出现全局变量和局部变量重命名时,无法引用全局变量 11 12 printf("%d ", a);//3 13 14 system("pause"); 15 }
//C++出现全局变量和局部变量重命名时,通过双冒号::全局域引用全局变量
1 #include <iostream> 2 using namespace std; 3 4 int a = 998;//全局变量 5 6 void main() 7 { 8 int a = 10;//局部变量 9 10 std::cout << a << std::endl;//10 11 12 std::cout << ::a << std::endl;//998,双冒号::是全局域,C++出现全局变量和局部变量重命名时,通过双冒号::全局域引用全局变量 13 }