一、命名空间
C++中存在大量的变量、函数和类,都存在于全局作用域中,会导致冲突。使用命名空间可以对标识符的名称进行本地化,来避免命名冲突或名字污染,达到名称隔离的目的。
C++使用namespace关键字定义命名空间,用来解决命名冲突问题,格式为:namespace后面跟命名空间名字,再接一对{ } ,{ }中是命名空间的成员。
(1)命名空间格式:
1. namespace N1 //N1是命名空间的名称 2. { 3. //命名空间的内容,既可以定义变量,也可以定义函数 4. int a = 0; 5. 6. int Add(int left, int right) 7. { 8. return left + right; 9. } 10. }
(2)命名空间可嵌套:
1. namespace N2 //N2命名空间中嵌套了N3命名空间 2. { 3. int a = 0; 4. int b = 0; 5. 6. int Add(int left, int right) 7. { 8. return left + right; 9. } 10. 11. namespace N3 12. { 13. int c; 14. int d; 15. 16. int sub(int left, int right) 17. { 18. return left - right; 19. } 20. } 21. }
(3)同一个工程中允许存在多个同名命名空间,编译器会合成到同一个命名空间中,如:
001-test.cpp中存在N1命名空间
“::”操作符是域解析操作符
1. #include<iostream> 2. using namespace std; 3. namespace N1 //N1是命名空间的名称 4. { 5. //命名空间的内容,既可以定义变量,也可以定义函数 6. int e; 7. 8. int Add(int left, int right) 9. { 10. return left + right; 11. } 12. } 13. 14. int main() 15. { 16. cout <<"e="<< N1::e << endl;//endl是全局换行符 17. return 0; 18. }
002-test.cpp中也存在N1命名空间
1. #include<iostream> 2. namespace N1 //N2命名空间中嵌套了N3命名空间 3. { 4. int b = 0; 5. int c = 8; 6. 7. namespace N3 8. { 9. int c; 10. int d; 11. 12. int sub(int left, int right) 13. { 14. return left - right; 15. } 16. } 17. }
注意:
(1)同一命名空间不能定义相同的变量名和函数名。
(2)一个命名空间定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
(3)C++为了防止命名冲突,把自己库里面的东西都定义在std命名空间中。
(1) 加命名空间名称及作用域限定符(N::a),比较麻烦,每个用到域中成员的地方都得指定成员的域
1. #include<iostream> 2. using namespace std; 3. 4. namespace N 5. { 6. int a = 0; 7. 8. int Add(int left, int right) 9. { 10. return left + right; 11. } 12. int Sub(int left, int right) 13. { 14. return left - right; 15. } 16. 17. namespace N1 //定义嵌套命名空间 18. { 19. int max(int left, int right) 20. { 21. return left > right ? left : right; 22. } 23. } 24. } 25. 26. int main() 27. { 28. cout << "a = " << N::a << endl; 29. 30. //嵌套命名空间的使用 31. int b = N::N1::max(3, 4); 32. cout << "b = " << b << endl; 33. 34. return 0; 35. }
(2)是用using将命名空间成员或函数引入(using N::a,访问a时就不需要加访问限定符"::")
1. #include<iostream> 2. using namespace std; 3. 4. namespace N 5. { 6. int a = 0; 7. 8. int Add(int left, int right) 9. { 10. return left + right; 11. } 12. int Sub(int left, int right) 13. { 14. return left - right; 15. } 16. } 17. 18. using N::a; 19. 20. int main() 21. { 22. cout << "a = " << a << endl; 23. return 0; 24. }
(3)使用using namespace 命名空间名称引入(using namespace N,访问a时就不需要加访问限定符"::")
1. #include<iostream> 2. using namespace std; 3. 4. namespace N 5. { 6. int a = 0; 7. 8. int Add(int left, int right) 9. { 10. return left + right; 11. } 12. int Sub(int left, int right) 13. { 14. return left - right; 15. } 16. } 17. 18. using namespace N; 19. 20. int main() 21. { 22. cout << "a = " << a << endl; 23. return 0; 24. }
对于std命名空间,如果使用using namespace 命名空间名称将std整个引入,那么库里面的东西全都被展开包含到全局了,虽然看起来方便,但是如果自己定义的内容和库冲突了,就没法解决了。所以日常练习可以使用using namespace std的方式引入std命名空间,规范的工程项目中不推荐。
using namespace std;
可以展开常用的命名空间,下面代码只用到打印,只展开cout和endl命名空间来代替展开std:
1. #include<iostream> 2. using std::cout; 3. using std::endl; 4. 5. namespace N 6. { 7. int a = 0; 8. 9. int Add(int left, int right) 10. { 11. return left + right; 12. } 13. int Sub(int left, int right) 14. { 15. return left - right; 16. } 17. } 18. 19. using N::a; 20. 21. int main() 22. { 23. cout << "a = " << a << endl; 24. return 0; 25. }
使用cout和endl时,也可以不使用using nampspace 命名空间,直接指定成员所在的域
1. #include<iostream> 2. 3. namespace N 4. { 5. int a = 0; 6. 7. int Add(int left, int right) 8. { 9. return left + right; 10. } 11. int Sub(int left, int right) 12. { 13. return left - right; 14. } 15. } 16. 17. using N::a; 18. 19. int main() 20. { 21. std::cout << "a = " << a << std::endl; 22. return 0; 23. }
二、C++输入输出
1.使用cout标准输出(控制台)和cin标准输入(键盘)时,必须要包含< iostream >头文件及std标准命名空间:
1. #include<iostream> 2. using namespace std;
2.c++可以自动识别类型,不需要增加数据格式控制。C语言必须要指定数据格式:整型--%d,字符--%c。
1. #include<iostream> 2. using namespace std; 3. 4. int main() 5. { 6. int a; 7. double b; 8. char c; 9. 10. cin >> a; 11. cin >> b >> c; 12. 13. cout << a << endl; 14. cout << b << " " << c << endl; 15. 16. return 0; 17. }
三、缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用给定的实参。
1. #include<iostream> 2. using namespace std; 3. 4. void TestFunc(int a = 0) 5. { 6. cout << a << endl; 7. } 8. 9. int main() 10. { 11. TestFunc(); //未给定实参 12. TestFunc(10); //给定实参 13. return 0; 14. }
(1)全缺省参数:在函数声明或定义时为所有参数都指定一个默认值,调用函数时只给传了实参的参数赋值为实参,否则为默认值:
1. #include<iostream> 2. using namespace std; 3. 4. void TestFunc(int a = 0, int b = 10, int c = 20) 5. { 6. cout << a << endl; 7. cout << b << endl; 8. cout << c << endl; 9. 10. cout << "\n" << endl; 11. } 12. 13. int main() 14. { 15. TestFunc(3); 16. TestFunc(3,4); 17. TestFunc(3, 4, 5); 18. 19. return 0; 20. }
(2)半缺省参数:在函数声明或定义时从右向左为部分参数指定一个默认值,且不能间隔给出
1. #include<iostream> 2. using namespace std; 3. 4. //void TestFunc(int a = 10, int b, int c = 20)间隔给出默认值,错误 5. //void TestFunc(int a = 10, int b, int c)从左向右给出默认值,错误 6. void TestFunc(int a, int b = 10, int c = 20) 7. { 8. cout << a << endl; 9. cout << b << endl; 10. cout << c << endl; 11. 12. cout << "\n" << endl; 13. } 14. 15. int main() 16. { 17. TestFunc(3); 18. TestFunc(3,4); 19. TestFunc(3, 4, 5); 20. 21. return 0; 22. }
注意:
(1)缺省参数不能在函数声明和定义中同时出现。
(2)缺省值必须是常量或者全局变量
(3)C语言不支持缺省(编译器不支持)