认识了一个作用域运算符::
若直接使用,则用于访问全局变量
int a=1;
int main()
{
int a=10;
cout<<a<<::a<<endl;//输出结果为101
return 0;
}
为了对多个变量名相同,但实际用法不同的变量进行封装,引入了namespace
用namespace可以将多个空间中的相同变量区分开
namespace A
{
int a=1;
}
namespace B
{
int a=10;
}
//引用时,可以用A::a和B::a的方式进行调用
此外,namespace还可以封装函数(方法)
namespace A
{
int a=1;
/*void func()
{
cout<<a<<endl;
}
在命名空间内定义*/
void func();//在命名空间外定义,但需记得在命名空间内声明
}
void A::func()//记得标注A::表示所写的函数是A中的函数
{
cout<<a<<endl;
}
当出现全局变量,局部变量,静态变量(namespace中的变量)时,优先级:局部>静态=全局
理解例子:
int a=1000;//全局变量
namespace Longname{
int a=100;//静态变量
void func();
}
void Longname::func()
{
cout<<"hello"<<endl;
}
void test01()
{
using namespace Longname;
int a=10;//test01函数中的局部变量//若写using Longname::a;则等价于使用局部变量,则会与a=10;矛盾
cout<<"a="<<a<<endl;
}
int main()
{int a=1;//main中的局部变量
test01();
return 0;
}
在这个例子中,main函数调用了test01,main中的a=1作用域无法被test01获取
在test01中,优先获取局部变量a=10,若其注释掉的话程序会报错。因为静态变量和全局变量都能被test01获取,且优先级一样高,故无法运行。
【tip:静态变量与全局变量的区别——当多个程序源文件在同一个项目中时,静态变量只能被该源文件访问,而全局变量可以被任意文件访问。】
在函数中,若想直接使用某个命名空间的元素,写上using namespace A即可。(如上面的例子,当出现局部变量与命名空间的变量重名时,优先使用局部变量,调用函数也同理)
当使用using遇到函数重载时,声明using namespace A::func;即可。后续对func()的调用取决于你传参的形式。