一、C++的命名空间
1.1命名空间的意义
在C语言大型代码编辑的过程当中,我们常常遇到命名冲突的问题,比如我们在使用了<stdlib.h>的头文件后,就不能再定义名为rand的变量了,因为在这一头文件下有rand()函数的定义,会发生命名冲突。
因此,命名空间namespace就是为了解决这一问题而生,而命名空间本身是作为一个独立的域存在的,与全局域,局部域并列,我们可以在他的内部定义函数,变量或类型(例如结构体,枚举类型,联合体类型等等)。
1.2命名空间的例子
namespace me
{
int rand=0;
}
这样做以后,我们就可以实现在有头文件<stdlib.h>的情况下照常定义变量rand了。
1.2-补充说明
在C语言中,我们允许不同的域定义同名变量,例如
int a=0;
int main()
{
int a=1;
printf("%d",a);
printf("%d",::a);//如果域作用限定符左侧为空,则默认访问全局域
return 0;
}
1.3使用命名空间的方式
1.3.1使用举例
例如,针对1.2中定义的命名空间,我么应该如何使用它呢?
printf("%d/n",me::rand);
1.3.2命名空间可以嵌套使用
比如在定义的时候
namespace me
{
namespace you
{
int rand=0;
}
}
则可以这样使用
printf("%d\n",me::you::rand);
1.3.3多个文件中的同名命名空间可以合并
例如在定义一个.h头文件和一个.cpp源文件的时候,我们可以在两个文件下都使用名为me的命名空间,在.h中实现函数声明,在.cpp中实现函数的定义,这样以后,在我们运行程序的时候会发现他们自动合并了,并不会报错。
1.3.4命名空间的展开
如果我们在写代码的时候没有命名冲突的问题,并且经常用到同一个命名空间内的某些变量,类型或函数,我们则可以把这一命名空间全部展开或部分展开
1.3.4.1命名空间的全展开
例如
using namespace me;
这样以后我们就可以正常使用命名空间“me”内部的函数,类型和变量而不加me::的前提了,但需要注意的是一旦展开,那么就不能在其他位置有相同的函数名/变量名了
1.3.4.2命名空间的部分展开
例如:
using me::rand;
这样以后就可以正常使用命名空间内部的变量rand而不加me::的前提了,但同样不能再其他位置有名为rand的定义了。
1.3-补充说明
Ⅰ.在我们使用一个变量/函数的时候,编译器会默认按照如下顺序进行查找
①当前局部域
②全局域&&展开的命名空间域
当我们在其中一个层次中找到了我们需要的变量/函数定义,就不再进入下一层次寻找了;当同一层次有多个定义,会报错
Ⅱ.::为域作用限定符,在命名空间的访问过程中常使用。
二、C++中的cin和cout
2.1关于iostream
是C++新增的一套新的输入/输出流,它里面有包含cout和cin的命名空间std,在VS编译器下还包含有<stdio.h>
2.2cout的使用方式
2.3.1 简介cout
c指的是console(控制台),out指的是输出,顾名思义:输出到控制台,cin也是同理。
2.3.2<<运算符的新含义
在C语言中,<<运算符只有一个含义:位的左移
而在C++中,为其新增了一个新的含义:流插入
2.3.3使用举例
int i=0;
double j=1.12;
cout<<i<<" "<<j<<endl;
这一代码可以在控制台上输出
0 1.12
证明了cout可以自动识别变量类型。
2.3.4使用前提
①指定访问std命名空间中的cout
std::cout<<//...
②展开整个域std
在整个主函数之前加
using namespace std;
③指定展开std域中的cout与endl
using std::cout;
using std::endl;
//也可以合并为(合并操作需要C++17标准以及更高)
//using std::cout,std::endl;
2.2-补充说明
cout输出方式在换行时有两种操作,其一是‘\n',其二是endl,他们的作用是等价的。
2.3cin的使用方式
2.3.1>>运算符的新定义
在C语言中,<<运算符只有一个含义:位的右移
而在C++中,为其新增了一个新的含义:流提取
2.3.2使用举例
int i=0;
double j=1.1;
cin>>i>>j;
这个代码可以实现i和j的输入;
2.3.3其余规则与cout相同
三、C++中的缺省参数(又名默认参数)
3.1缺省参数的使用举例
void F1(int a=0)
{
cout<<a<<endl;
}
int main()
{
F1(2);
F1();
return 0;
}
其中,参数a因为加了“=0”这一缺省值,就成为了缺省参数。
运行起来我们会发现打印了两行
2
0
因此,对于含有缺省参数的函数有两种可能
①传参,则接收传入参数的值
②不传参,用缺省值传入
3.3缺省参数的不同应用方式
3.3.1全缺省
缺省参数可以有多个,全缺省意味着所有参数都有一个缺省值
但是我们在使用的时候,例如
void F2(int a=10,int b=20,int c=30);
int main()
{
F2(1,2,3);//传入参数位1,2,3
F2(1,2);//传入参数为1,2,30
F2(1);//传入参数为1,20,30
F2();//传入参数为10,20,30
return 0;
}
像注释中标注的这样,只能从左向右进行参数的传递
3.3.2部分缺省
缺省参数可以有多个,部分缺省意味着只有部分参数有缺省值
在C++中,我们规定部分缺省的参数列表的缺省值只能从右向左写,以避免出现不知道传给谁的情况。
3.3-补充说明
缺省参数中缺省值的添加要在函数声明中进行,而不是在函数定义中。