【理論實踐】實例體會一下using聲明會屏蔽外層作用域的同名實體

理論鋪墊:

using 聲明:明確指定使用哪個作用域下的實體,比如:   using std::vector。一次只能引用一個命名空間的一個成員。

using 指示:明確指定引用哪個命名空間,比如:using namespace std。相當於引用所有成員。

using 聲明和指示可以出現在:全局作用域、局部作用域、命名空間作用域,但僅using聲明可以出現在類的作用域中(定義類的{}裏)。


using  聲明引用A之後,會屏蔽外層作用域同名實體,比如以下代碼,輸出是

ns1
ns2
ns1
ns1   //這裏不是ns2
ns1
ns2

#include <iostream>

namespace ns1
{
void foo(int)
{
	std::cout << "ns1" << std::endl;
}
}
namespace ns2
{
void foo(double)
{
	std::cout << "ns2" << std::endl;
}
}

int main(int argc, char const *argv[])
{
	int a = 10;
	double b = 11.1;

	using namespace ns1;  //using 聲明
	using namespace ns2;  //using 聲明
	foo(a);     //ns1::foo(int)
	foo(b);     //ns2::foo(double)

	using ns1::foo;       //using 指示,屏蔽了上面2處聲明
	foo(a);     //ns1::foo(int)
	foo(b);     //ns1::foo(int),不是ns2::foo(double)

	using ns2::foo;       //using 指示,新引入重載函數
	foo(a);     //ns1::foo(int)
	foo(b);     //ns2::foo(double)

	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章