using关键字

C++中using关键字的用法总结:

  • using指示(引入命名空间)
  • using声明  
  • 类型重定义,取代typedef

1、using指示(引入命名空间)

这是最常见最熟悉的用法,刚开始学C++的第一个“Hello word!”就用到,using namespace std;

using namespace std;                 // 应尽量少使用
 
int x;
std::cin >> x;                       // 应尽量这样使用
std::cout << x << std::endl;  
 
using std::cin;                      // 或者像这样集中命名
using std::cout;
using std::endl;
int x;
cin >> x;
cout << x <<endl;

不恰当的使用using可能带来名称的冲突,如果与局部名称发生冲突,则局部名称会覆盖命名空间的同名字段,编译器不会发出警告;而如果与全局变量名称发生冲突,编译器会发出指示。

2、using声明

using 声明中引入的名字遵循常规作用域规则:外部作用域中定义的同名实体会被屏蔽

#include <iostream>
namespace Lib
{
    void print(int x) {
        std::cout << "int类型:" << x << std::endl;
    }
}
void print(double y){
    std::cout<<"double类型:"<<y<<std::endl;
}

int main() {
    using Lib::print;               // main作用域中嵌套了Lib命名空间
    print(1.36);                    // main外的 void print(double y) 函数被屏蔽
    print(3);
    return 1;
}
#include<iostream>namespace Lib
{
    void print(int x)
    {
        std::cout<<"int类型:"<<x<<std::endl;
    }
}
void print(double y){
        std::cout<<"double类型:"<<y<<std::endl;
    }
using Lib::print;                 // main作用域中平行于Lib命名空间
int main()
{
    print(1.36);                  // 选择调用重载函数中的 void print(double y)
    print(3);                     // 选择调用重载函数中的 void print(int y)
    return 1;

3、类型重定义,取代typedef

这是C++11的新用法,类似于typedef的别名表达。

using alias = typename

在 C++98/03 中 ,typedef 重定义有一些限制,比如,模板。
我们想实现这样一个模板:将一个 int 映射到任意类型,类似于我们想表达这种效果:

typedef std::map<int, int> map_int_t;
typedef std::map<int, std::string> map_str_t;
typedef std::map<int, bool> map_b_t;

在 C++98/03 中 需这样写:

template<typename Val>
struct int_map{
    typedef std::map<int, Val> type;
};
 
int main(){
    int_map<int>::type imap;
 
    return 0;
}

而在C++11中,可以使用using这样写:

template<typename Val>
using int_map_t = std::map<int, Val>;
 
int main(){
    int_map_t<int> imap;
 
    return 0;
}

 

 

参考博客:

1、using 关键字在 C++ 中的几种用法

 

posted @ 2020-10-03 11:51  运运翻牌了Howardy  阅读(208)  评论(0)    收藏  举报