C++:using关键字详解
一、using声明
1、命名空间中变量调用方式:
#include <iostream>
using namespace std;
namespace A // 声明命名空间A
{
int paramx = 20;
int paramy = 30;
void fun01()
{
cout<<"Hello func01"<<endl;
}
void fun02()
{
cout<<"Hello func02"<<endl;
}
}
// 命名空间中变量调用方式
void test01()
{
// 1、通过命名空间域运算符(::)
cout<<"A::paramx = "<<A::paramx<<endl;
A::fun01();
// 2、using声明
using A::paramy;
using A::fun02;
cout<<"A::paramy = "<<paramy<<endl;
// cout<<"A::paramx = "<<paramx<<endl; // paramx未用using声明,不可直接访问。
// 3、同名冲突
// int paramy = 100; // 相同作用域注意同名冲突。
}
int main()
{
test01();
return 0;
}
2、using声明遇到函数重载:若命名空间包含一组用相同名字重载的函数,using声明就声明了这个重载函数的所有集合。
#include <iostream>
using namespace std;
namespace B
{
void func()
{
}
void func(int x)
{
}
int func(int x, int y)
{
return x + y;
}
}
int main()
{
using B::func;
func();
func(10);
cout<<func(10, 20)<<endl;
return 0;
}
二、using编译指令 - using编译指令使整个命名空间标识符可用。
注意:使用using声明和using编译指令会增加命名冲突的可能性。即,若存在命名空间, 在代码中使用作用域解析运算符(::),可避免二义性。
namespace C
{
int paramx = 20;
int paramy = 30;
void fun01()
{
cout<<"Hello func01"<<endl;
}
void fun02()
{
cout<<"Hello func02"<<endl;
}
}
namespace D
{
int paramx = 20;
int paramy = 30;
void fun01()
{
cout<<"Hello func01"<<endl;
}
void fun02()
{
cout<<"Hello func02"<<endl;
}
}
void test03()
{
using namespace C;
cout<<"C::paramx = "<<paramx<<endl;
cout<<"C::paramy = "<<paramy<<endl;
fun01();
fun02();
// 不会产生二义性
int paramx = 100;
cout<<"C::paramx = "<<paramx<<endl;
}
void test04()
{
using namespace C;
using namespace D;
// 二义性产生,不知道调用C中paramx还是D中paramx。
//cout<<"paramx = "<<paramx<<endl;
}
void test05()
{
int* param = &(C::paramx);
*param = 1000;
cout<<"param = "<<*param<<endl;
}
int main()
{
test03();
test04();
test05();
return 0;
}