我重生了,今天开始带着上世纪的回忆重新学习C++
目录
命名空间(namespace)
输入输出流
缺省参数(默认参数)
函数重载
命名空间(namespace)
新定义命名空间是C++为防止对变量,函数,类命名冲突而提出的新的解决措施。是在全局作用域之外的自己定义的属于命名空间自己的 特定域范围。每一个域范围互不干扰,界限分明。使用时可以避免命名冲突。
#include<iostream>
using namespace std;
namespace myspace
{
int a=20;//这个a在命名空间中
void func()//这个函数在命名空间中
{
cout<<"is my func"<<endl;
}
}
int a=10;//这个a在全局作用域中
void func()//此函数在全局作用域中
{
cout<<"is your func"<<endl;
}
int main()
{
cout<<a<<endl;
func();
return 0;
}
上图的输出结果是
由此我们可以看出:全局作用域和命名空间互不干扰,界限分明。默认使用的是全局作用域的变量、函数、类。
那么如何使用命名空间内的变量、函数、类?
命名空间的使用分为三种:1.命名空间全部展开 2.命名空间部分展开 3.指定使用
下面依次说明:
命名空间的全部展开:是直接将命名空间内的变量、函数、类展开到全局作用域范围,使得全局范围的代码可以直接使用命名空间内定义的内容。但是这种方式比较危险,容易和原全局作用域范围内的变量、函数、类名相同,造成矛盾。
#include<iostream>
using namespace std;
namespace myspace
{
int a = 20;//这个a在命名空间中
void func()//这个函数在命名空间中
{
cout << "is my func" << endl;
}
}
using namespace myspace;//全部展开方式:using+namespace+命名空间名
int main()
{
cout << a << endl;//使用的是命名空间的变量和函数
func();
return 0;
}
冲突: 如果全局作用域内和命名空间内有相同的变量、函数、类名就不能直接全部展开,否则会出现名字相同的矛盾。
命名空间的部分展开:命名空间的部分展开是将命名空间内的某个变量、函数、类暴露到全局作用域范围。从而使用命名空间。
#include<iostream>
using namespace std;
namespace myspace
{
int a = 20;//这个a在命名空间中
void func()//这个函数在命名空间中
{
cout << "is my func" << endl;
}
}
using myspace::a;//部分展开规则:using+命名空间名+::+要使用的变量或函数或类
int main()
{
cout << a << endl;//这里只能访问到a,不能访问到func()
return 0;
}
命名空间的指定使用:命名空间的指定使用是不展开命名空间内的任何变量、函数、类。在要使用的地方直接指定使用,要在每一个使用的地方指定。这种方法最繁琐,但是却最安全,没有重名的隐患。
#include<iostream>
using namespace std;
namespace myspace
{
int a = 20;//这个a在命名空间中
void func()//这个函数在命名空间中
{
cout << "is my func" << endl;
}
}
int main()
{
cout << myspace::a << endl;//指定使用规则:指定的命名空间名+::+变量或函数或类
myspace::func();
return 0;
}
命名空间的自动合并
在两个不同文件的两个命名空间,或者同一文件的两个命名空间,如果这两个命名空间的名字相同,命名空间内部将会自动合并。
例如,在一个最简单的C++程序中,
#include<iostream>
#include<stdlib.h>
using namespace std;//合并后共有的std标准命名空间全部展开
int main()
{
cout<<"hello world"<<endl;
return 0;
}
这里包含了两个头文件,但是他们内部都共有std这个标准命名空间。他们两个各自的std命名空间就会合并为一个共有的命名空间std。
如何合理应用std?
日常练习中,直接using namespace std将标准命名空间全部展开即可。但是在大型项目中,要谨慎展开,防止std中的名字与项目内的其他全局变量、函数、类名相同。
输入输出流
这里只介绍最基本的C++输入输出
#include<iostream>
using namespace std;
int main()
{
int a = 0;
char ch;
cout << "请输入a" << endl;
cin >> a;
cout<< "请输入ch" << endl;
cin >> ch;
cout << "a=" <<a << endl;
cout << "ch=" << ch << endl;
return 0;
}
缺省参数(默认参数)
#include<iostream>
using namespace std;
void func(int x=2)
{
cout<<x<<endl;
}
int main()
{
func();//没有指定实参,使用缺省值2
func(1);//指定实参则使用指定实参
return 0;
}
全缺省与半缺省
全缺省:函数参数全部为缺省参数。半缺省:函数部分参数为缺省参数。
注意:
void Func(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
#include<iostream>
using namespace std;
void func(int x = 2);//函数声明已给缺省参数
void func(int x)//函数定义,这里不可以是缺省参数(int x=2)
{
cout << x << endl;
}
int main()
{
func();
func(1);
return 0;
}
函数重载
#include<iostream>
using namespace std;
void func()
{
cout << "null" << endl;
}
void func(int x)
{
cout << x << endl;
}
int main()
{
func();//调用无参func
func(1);//调用有参func
return 0;
}
2.参数类型不同
#include<iostream>
using namespace std;
void swap(int* a,int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void swap(char* a, char* b)
{
char tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 2, b = 3;
char c = 'j', d = 'k';
swap(a, b);//调用int,int的swap
swap(c, d);//调用char,char的swap
cout << "a=" << a << " "<< "b=" << b << endl;
cout << "c=" << c <<" " << "d=" << d << endl;
return 0;
}
3.类型顺序不同
#include<iostream>
using namespace std;
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
int main()
{
f(2, 'a');//调用int char的f函数
f('a', 2);//调用char int的f函数
return 0;
}