目录
一.命名空间:namespace
1.namespace的价值
2.namespace的定义
3.namespace的使用方法
3.1 域解析运算符::
3.2 using展开
3.3 using+域解析运算符
二.输入输出
三.缺省参数
四.函数重载
1.参数类型不同
2.参数个数不同
3.参数顺序不同
一.命名空间:namespace
1.namespace的价值
在C/C++中,存在大量变量、函数,它们的名称都存在在全局作用域中,可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化,避免命名的冲突。
2.namespace的定义
使用namespace关键字定义一个域,这个域跟全局域各自独立,不同的域中可以定义相同名字的变量,这就避免的命名的冲突。其中C++标准库都放在一个叫std(standard)的命名空间中。例如以下代码:同一个名的变量rand在不同域中表现不同的内容
TIPs:cout<< <<endl相当于C语言中的printf(" \n");
#include<iostream>
#include<stdlib.h>
using namespace std;
namespace zyh
{
int rand = 10;
}
int main()
{
//默认是std::rand
//标准库中rand是一个地址
cout << rand << endl;
//命名空间zyh中rand是一个Int变量
cout << zyh::rand << endl;
return 0;
}
C++中域有局部域,全局域,命名空间域,类域;局部域、全局域会影响编译查找逻辑和变量的生命周期,但命名空间域和类域不会影响变量的生命周期。
namespce只能定义在全局中,并且支持嵌套定义。项目工程文件中多文件中定义的同名namespace会被认为是一个namespace,自动合并到一起。
//嵌套定义
namespace zyh
{
int rand = 10;
namespace zyh2
{
int rand = 20;
}
}
3.namespace的使用方法
3.1 域解析运算符::
在变量名前加上(命名空间名) + :: (域解析运算符)就可以访问指定命名空间域中的变量了,例如:
namespace zyh
{
int a = 10;
int b = 20;
}
int main()
{
//访问命名空间域zyh中的a和b
cout<<zyh::a<<endl;
cout<<zyh::b<<endl;
return 0;
}
3.2 using展开
using + (命名空间名);直接将命名空间内的所有成员全部展开,也就是说展开后无需加域解析运算符就可访问,但这种方式风险极大,不推荐在项目中使用,例如:
namespace zyh
{
int a = 10;
int b = 20;
}
//直接使用using展开命名空间zyh
using namespce zyh;
int main()
{
/展开后就能直接访问命名空间域zyh中的a和b
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
3.3 using+域解析运算符
这就是前两者的结合版,将命名空间域中的某个成员进行展开使用,这种方式是比较合理的,也经常使用到,例如cout和endl是std命名空间中的输出和换行,由于经常要用到,因此可以在程序最开头直接将这两个成员进行展开,此后方便使用。
using std::cout;
using std::endl;
int main()
{
int a = 10;
cout<<a<<endl;
}
二.输入输出
C++的输入输出相较于C语言就舒服多了,C++不需要自己手动输入格式,它能自动识别变量的类型(本质是通过函数重载实现的)并进行输入输出。
- <iostream>是input,output stream的缩写,是标准输入、输出流库,定义了标准的输入、输出对象
- std::cin相当于scanf,配合流插入运算符>>,实现数据的输入
- std::cout相当于printf,配合流输出运算符<<,实现数据的输出
- std:endl相当于换行(此时可以这么理解)
using std::cout;
using std::endl;
using std::cin;
int main()
{
int a;
double b;
char c;
//不同类型的abc,cin和cout都能自动识别处理
cin >> a;
cin >> b;
cin >> c;
cout << a << "/" << b << "/" << c << endl;
return 0;
}
三.缺省参数
有些地方缺省参数也叫做默认参数,它是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定的实参,则采用该形参的缺省值,否则就使用指定的实参。
全缺省就是全部形参都给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。原因很好理解,就是为了防止歧义,例如4个参数中只有第一个和最后一个有缺省值,那么若给的实参有3个,应该如何分配?为了应对这些情况,C++特意做出的规定。
函数声明和定义分离的时候,缺省参数不能在函数声明和定义中同时出现,否则就会出现歧义,规定必须函数声明给缺省值。
//全缺省
void func1(int a = 10, int b = 20, int c = 30)
{
cout << a << "/" << b << "/" << c << endl;
}
//半缺省
void func2(int a, int b = 0, int c = 0)
{
cout << a << "/" << b << "/" << c << endl;
}
int main()
{
func1();
func1(666);
func1(1, 2, 3);
func2(6);
func2(6, 7, 8);
return 0;
}
四.函数重载
C++支持在同一作用域下出现相同的函数名,区别在于这些同名函数的形参不同,这个不同,可以是参数个数,参数类型,或参数顺序。C语言是不支持同一作用域中出现同名函数的,这一改动就是为了方便使用,更加灵活。
1.参数类型不同
int Add(int a, int b)
{
return a + b;
}
double Add(double a, double b)
{
return a + b;
}
int main()
{
cout << Add(3, 4) << endl;
cout << Add(1.1, 2.2) << endl;
return 0;
}
2.参数个数不同
int Add(int a, int b)
{
return a + b;
}
int Add(int a, int b, int c)
{
return a + b + c;
}
3.参数顺序不同
实际上也就是参数类型不同
void f(int a, double b)
{
cout << "f1" << endl;
}
void f(double b, int a)
{
cout << "f2" << endl;
}
int main()
{
f(1, 1.2);
f(2.2, 4);
return 0;
}
注意:返回值不能最为函数重载的条件,因为调用函数的时候无法区分,因此只能将参数的区别作为函数重载的依据