using的使用

using声明

形式:

using mysapce::myname;  //表示声明namespace空间的name成员

作用域:从using声明地方开始,一直到using声明所在的作用域结束为止,在此过程中外层作用域的同名实体将被隐藏。

using指示

形式:

using namespace myname;  

作用域规则与声明相同

对比

  • using指示无法控制哪些名字是可见的,因为命名空间所有名字都是可见的。
  • using声明可以出现在全局作用域、局部作用域、命名空间作用域以及类作用域;using指示只能不能出现在类作用域。
  • using指示具有将命名空间成员提升到包含命名空间本身和using指示最近作用域的能力。
//命名空间A和函数f定义在全局作用域中
namespace A
{
    int i,j;
}
void f()
{
    using namespace A;  //把A中的名字注入到全局作用域中
    cout<<i*j<<endl;  //使用命名空间A中的i和j
    //...
}   

总结

在头文件顶层作用域中应避免含有using指示或using声明,则会将名字注入所有包含该头文件的文件中。而通常情况下头文件只负责定义接口部分的名字,而不定义实现部分的名字。因此头文件最只能在它的函数或命名空间内使用using指示和using声明。

### C++ 中 `using` 关键字的用法 #### 使用指令 (Using Directive) 通过使用指令,可以从命名空间引入所有名称到当前作用域。这使得可以直接使用该命名空间中的对象而不必每次都加上命名空间前缀。 ```cpp #include <iostream> #include <vector> // 将整个 std 命名空间的内容引入全局作用域 using namespace std; int main() { vector<int> vec; cout << "Vector size is: " << vec.size(); } ``` 上述代码展示了如何利用 `using namespace` 来简化对标准库容器和流的操作[^1]。 #### 使用声明 (Using Declaration) 使用声明允许特定的名字从另一个命名空间或类中被引入到当前的作用域内。这种方式更加精确控制哪些名字应该可用,并有助于避免潜在冲突。 ```cpp namespace MyNamespace { int myFunction(int a, int b); } // 只导入指定函数至全局作用域 using MyNamespace::myFunction; int main() { // 调用来自MyNamespace的myFunction无需加前缀 int result = myFunction(5, 7); } ``` 此例子说明了怎样仅暴露所需的功能给外部使用者,从而保持接口清晰简洁。 #### 类型别名定义 除了处理命名空间外,`using` 还可用于创建类型别名,即为现有类型赋予新的名称。这对于提高可读性和减少冗余特别有用: ```cpp #include <functional> // 创建一个指向接受整数参数并返回无类型的回调函数指针别名 using Callback = std::function<void(int)>; void process(int value, Callback cb) { cb(value); } int main() { // 实例化lambda表达式作为Callback类型的变量 Callback print = [](int x) { std::cout << "Value: " << x << "\n"; }; process(42, print); } ``` 这里展示了一个实际应用场景——设置事件处理器或其他形式的消息传递机制时非常方便[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值