using声明与using指示的区别(在作用域上)

在《C++ Primer》第五版十八章中详细描述了 using 指示与 Using 声明的区别,个人也想了好久。首先,明确一下 using 声明与指示

using 声明: using std::cout;

using 指示: using namespace std;

1.初步展示区别

在我们通常的理解下,using 声明引入了一个名字,在声明之后的作用域中,所有用到该名字的地方,都是指的改名字。而using 指示则是将命名空间中的所有名字都引入当前作用域,效果有些类似若干个 using 声明。但事实上,这两个是存在很大的不同的。看以下例子:

(1)对using 声明:

namespace N1
{
	int a = 0;
}

void f()
{
	using N1::a;  //此时下文中所有的 a 都将等效为 N1::a
	int a = 4;    //这句话将会导致编译器报重复定义的错误,因为 a 已经定义为 int a = 0,此时再次定义就重定义了
	cout << a << endl;
}

(2)对 using 指示

在C++中,using声明using指示using关键字的两种主要用法,它们既有联系又有区别。 ### 联系 二者都能让我们使用命名空间的简写形式,从相应语句所在位置开始,直至所在作用域结束,都可使用命名空间成员的简写,从而简化代码中对命名空间成员的引用 [^1][^2][^3]。 ### 区别 - **引入成员范围**:using声明一次仅能引入命名空间的一个成员,比如`using std::string`;而using指示会让特定命名空间的所有成员都可见,例如`using namespace std` [^3]。 - **二义性错误检测时机**:若引发二义性错误,using声明声明点就能被检测到;而using指示要在使用命名空间成员时才会被检测到 [^3]。 - **作用域处理**:using声明的有效范围是从声明开始,到声明所在的作用域结束;using指示一般被视为出现在最近的外层作用域,若存在同名冲突成员,需要加限定符来区分 [^3]。 - **命名空间污染风险**:使用using声明相对更安全,因为它只导入指定的名称,若该名称局部名称冲突,编译器会发出指示using指示导入所有名称,包括可能不需要的,若局部名称冲突,局部名称会覆盖命名空间版本,且编译器不发警告,还因命名空间的开放性,难以明确添加了哪些名称,所以应尽量少用using指示来避免污染命名空间 [^4]。 ### 代码示例 ```cpp #include <iostream> namespace MyNamespace { int value = 10; void printValue() { std::cout << "Value in MyNamespace: " << value << std::endl; } } // using声明 void usingDeclarationExample() { using MyNamespace::value; std::cout << "Using declaration: " << value << std::endl; // 只能使用声明成员 // MyNamespace::printValue(); // 错误,未声明 } // using指示 void usingDirectiveExample() { using namespace MyNamespace; std::cout << "Using directive: " << value << std::endl; printValue(); // 可以使用命名空间的所有成员 } int main() { usingDeclarationExample(); usingDirectiveExample(); return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值