1、命名空间(namespace)
意义:命名空间相当于给函数划分作用域,用户可以自己对该空间命名,方便函数和变量的调用和查找,而且还能避免因与全局变量或者声明的函数同名而造成的混乱现象的发生。
1.1命名空间的定义方式
在如下代码中定义了一个全局变量和一个add函数,然后定义了一个命名空间Hu,空间中包含与上面变量和函数相同的名称。另外,如果命名空间的名字相同则编译器会自动合并。
int mydata = 10;
int add(int a, int b) {
return (a + b)*2;
}
//定义命名空间(定义作用域)
namespace Hu{
int mydata = 10;
int add(int a,int b){
return a+b;
}
}
1.2命名空间中的变量使用
int main() {
Hu::mydata = 10;//变量作用域名+::+变量名
int ret = Hu::add(1, 2);
return 0;
}
1.3命名空间的展开
如果命名空间中的变量或者函数名使用频率比较高,每一次按照1.1中调用命名空间中的变量会显得很繁琐,而命名空间的展开能很好解决这种问题。
(1)直接展开:和全局变量直接合并在一起。虽然后面能更方便调用命名空间中的函数或者变量,但是这样就相当于让命名空间直接失效,因此这种方式几乎不会使用。
using namespace Hu;
(2)指定函数展开(部分授权):指定命名空间中常用的函数或变量名进行展开。便于函数的调用,但是对于与全局变量同名变量或者函数,这种方式也不能使用,同样会造成重定义的程序错误。对于同名的情况,只能用1.1中的方式调用命名空间中的变量。
using Hu::add;
int main() {
int ret = add(1, 2);
return 0;
}
2、关于控制台输入输出函数
控制台输入输出函数定义在头文件#include<iostream>并且封装在命名空间std中,在调用时首先要展开std命名空间,其中常用的函数有cout(控制台输出)、cin(控制台输入)和endl(换行),这些函数能自动识别变量类型,调用过程无需像scanf和printf一样要指定输入输出类型,在使用这些函数的同时常用的符号有“>>”和“<<”,前者表示数据流提取,后者表示数据流插入。
#include<iostream>
using std::cout;
using std::endl;
using std::cin;
int main() {
Hu::mydata = 10;
int ret = add(1, 2);
int i ,j,k;
cin >> i;//先往控制台中输入一个数据,然后将数据流中的数据提取到i中。
cin >> j >> k;//输入两个数据,其之间要用空格以示区分,依次提取到j,k中。
cout << Hu::mydata<< endl;//将Hu::mydata和换行依次插入到控制台输出流中
cout << ret << endl;
cout << i << ' '<<j << ' ' <<k << endl;
return 0;
}
3、缺省参数
namespace Hu {
int min(int a = 20, int b = 10);//命名空间中声明函数
}
//定义命名空间中的函数
int Hu::min(int a, int b) {
return a - b;
}
(1)半缺省参数: 必须从右往左依次来给出,不能间隔着给。
using Hu::min;//指定函数展开
using std::cout;
using std::endl;
int main() {
cout << min(30)<< endl;//未传参的数用函数声明中的缺省值传参
return 0;
}
(2)全缺省参数:不能在函数声明和定义中同时出现(一般在定义时不用写缺省参数,声明写就行)。
using Hu::min;
using std::cout;
using std::endl;
int main() {
cout << min()<< endl;//未进行传参,则用缺省值进行传参
return 0;
}
4、函数重载
在同一作用域中定义相同函数名但参数类型或者参数个数不一样的函数。
优点:使具有同一作用的函数适用于不同类型参数的场合,让程序更直观。
特殊情况:函数名相同,但是其中一个函数比另一个函数参数个数多,且多的参数全是缺省值,这样也能构成函数重载,但是调用时,不能有缺省值,不然程序运行会错误。
namespace Hu {
int min(int a, int b = 10);//命名空间中声明函数
int min(int a);
}
//定义命名空间中的函数
int Hu::min(int a, int b) {
return a - b;
}
int Hu::min(int a) {
return a;
}
using std::cout;
using std::endl;
using Hu::min;
int main() {
cout << min(30,10)<< endl;//不能写成min(30),这种情况编译器无法区分该调用哪一个函数
return 0;
}