我重生了,今天开始带着上世纪的回忆重新学习C++
命名空间(namespace)
新定义命名空间是C++为防止对变量,函数,类命名冲突而提出的新的解决措施。是在全局作用域之外的自己定义的属于命名空间自己的 特定域范围。每一个域范围互不干扰,界限分明。使用时可以避免命名冲突。
1. #include<iostream> 2. using namespace std; 3. namespace myspace 4. { 5. int a=20;//这个a在命名空间中 6. void func()//这个函数在命名空间中 7. { 8. cout<<"is my func"<<endl; 9. } 10. } 11. int a=10;//这个a在全局作用域中 12. void func()//此函数在全局作用域中 13. { 14. cout<<"is your func"<<endl; 15. } 16. int main() 17. { 18. cout<<a<<endl; 19. func(); 20. return 0; 21. }
上图的输出结果是
由此我们可以看出:全局作用域和命名空间互不干扰,界限分明。默认使用的是全局作用域的变量、函数、类。
那么如何使用命名空间内的变量、函数、类?
命名空间的使用分为三种:1.命名空间全部展开 2.命名空间部分展开 3.指定使用
下面依次说明:
命名空间的全部展开:是直接将命名空间内的变量、函数、类展开到全局作用域范围,使得全局范围的代码可以直接使用命名空间内定义的内容。但是这种方式比较危险,容易和原全局作用域范围内的变量、函数、类名相同,造成矛盾。
1. #include<iostream> 2. using namespace std; 3. namespace myspace 4. { 5. int a = 20;//这个a在命名空间中 6. void func()//这个函数在命名空间中 7. { 8. cout << "is my func" << endl; 9. } 10. } 11. using namespace myspace;//全部展开方式:using+namespace+命名空间名 12. int main() 13. { 14. cout << a << endl;//使用的是命名空间的变量和函数 15. func(); 16. return 0; 17. }
冲突: 如果全局作用域内和命名空间内有相同的变量、函数、类名就不能直接全部展开,否则会出现名字相同的矛盾。
命名空间的部分展开:命名空间的部分展开是将命名空间内的某个变量、函数、类暴露到全局作用域范围。从而使用命名空间。
1. #include<iostream> 2. using namespace std; 3. namespace myspace 4. { 5. int a = 20;//这个a在命名空间中 6. void func()//这个函数在命名空间中 7. { 8. cout << "is my func" << endl; 9. } 10. } 11. using myspace::a;//部分展开规则:using+命名空间名+::+要使用的变量或函数或类 12. int main() 13. { 14. cout << a << endl;//这里只能访问到a,不能访问到func() 15. return 0; 16. }
命名空间的指定使用:命名空间的指定使用是不展开命名空间内的任何变量、函数、类。在要使用的地方直接指定使用,要在每一个使用的地方指定。这种方法最繁琐,但是却最安全,没有重名的隐患。
1. #include<iostream> 2. using namespace std; 3. namespace myspace 4. { 5. int a = 20;//这个a在命名空间中 6. void func()//这个函数在命名空间中 7. { 8. cout << "is my func" << endl; 9. } 10. } 11. int main() 12. { 13. cout << myspace::a << endl;//指定使用规则:指定的命名空间名+::+变量或函数或类 14. myspace::func(); 15. return 0; 16. }
命名空间的自动合并
在两个不同文件的两个命名空间,或者同一文件的两个命名空间,如果这两个命名空间的名字相同,命名空间内部将会自动合并。
例如,在一个最简单的C++程序中,
1. #include<iostream> 2. #include<stdlib.h> 3. using namespace std;//合并后共有的std标准命名空间全部展开 4. int main() 5. { 6. cout<<"hello world"<<endl; 7. return 0; 8. }
这里包含了两个头文件,但是他们内部都共有std这个标准命名空间。他们两个各自的std命名空间就会合并为一个共有的命名空间std。
如何合理应用std?
日常练习中,直接using namespace std将标准命名空间全部展开即可。但是在大型项目中,要谨慎展开,防止std中的名字与项目内的其他全局变量、函数、类名相同。
输入输出流
这里只介绍最基本的C++输入输出
1. #include<iostream> 2. using namespace std; 3. int main() 4. { 5. int a = 0; 6. char ch; 7. cout << "请输入a" << endl; 8. cin >> a; 9. cout<< "请输入ch" << endl; 10. cin >> ch; 11. cout << "a=" <<a << endl; 12. cout << "ch=" << ch << endl; 13. 14. return 0; 15. }
说明:
1. 使用cout标准输出对象(console out控制台输出)和cin标准输入对象(console in控制台输入)时,必须包含< iostream >头文件,以及按命名空间使用方法使用std(标准命名空间)。
2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
iostream >头文件中。
3. <<是流插入运算符,>>是流提取运算符。
4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
C++的输入输出可以自动识别变量类型。
5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识。
缺省参数(默认参数)
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参。如下
1. #include<iostream> 2. using namespace std; 3. void func(int x=2) 4. { 5. cout<<x<<endl; 6. } 7. int main() 8. { 9. func();//没有指定实参,使用缺省值2 10. func(1);//指定实参则使用指定实参 11. return 0; 12. }
全缺省与半缺省
全缺省:函数参数全部为缺省参数。半缺省:函数部分参数为缺省参数。
注意:
1. 半缺省参数必须从右往左依次来给出,不能间隔着给。
1. void Func(int a, int b = 10, int c = 20) 2. { 3. cout<<"a = "<<a<<endl; 4. cout<<"b = "<<b<<endl; 5. cout<<"c = "<<c<<endl; 6. }
2. 缺省参数不能在函数声明和定义中同时出现。声明给,定义就不能给。
1. #include<iostream> 2. using namespace std; 3. void func(int x = 2);//函数声明已给缺省参数 4. void func(int x)//函数定义,这里不可以是缺省参数(int x=2) 5. { 6. cout << x << endl; 7. } 8. int main() 9. { 10. func(); 11. func(1); 12. return 0; 13. }
函数重载
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。
1.参数个数不同:
1. #include<iostream> 2. using namespace std; 3. void func() 4. { 5. cout << "null" << endl; 6. } 7. void func(int x) 8. { 9. cout << x << endl; 10. } 11. int main() 12. { 13. func();//调用无参func 14. func(1);//调用有参func 15. return 0; 16. }
2.参数类型不同
1. #include<iostream> 2. using namespace std; 3. void swap(int* a,int* b) 4. { 5. int tmp = *a; 6. *a = *b; 7. *b = tmp; 8. } 9. void swap(char* a, char* b) 10. { 11. char tmp = *a; 12. *a = *b; 13. *b = tmp; 14. } 15. int main() 16. { 17. int a = 2, b = 3; 18. char c = 'j', d = 'k'; 19. swap(a, b);//调用int,int的swap 20. swap(c, d);//调用char,char的swap 21. cout << "a=" << a << " "<< "b=" << b << endl; 22. cout << "c=" << c <<" " << "d=" << d << endl; 23. return 0; 24. }
3.类型顺序不同
1. #include<iostream> 2. using namespace std; 3. void f(int a, char b) 4. { 5. cout << "f(int a,char b)" << endl; 6. } 7. void f(char b, int a) 8. { 9. cout << "f(char b, int a)" << endl; 10. } 11. int main() 12. { 13. f(2, 'a');//调用int char的f函数 14. f('a', 2);//调用char int的f函数 15. return 0; 16. }