C++中using的三种用法举例详解

 更新时间:2023年02月03日 10:56:23   作者:wuqiongjin  
最近在使用中,发现了一种以前没学过的using用法,于是在这里,将using的几种用法总结一下,下面这篇文章主要给大家介绍了关于C++中using的三种用法,需要的朋友可以参考下

1. using声明(引入单个名称)

using声明是将命名空间中某个名字单独引入到当前作用域。这使得我们在当前作用域下可以直接使用该名字而无需使用作用域限定符::

using std::string;
string s = "123";

using声明可以改变派生类对父类成员的访问控制。

class Base{
protected:
    int bn1;
    int bn2;
};
 
class Derived: private Base{	//私有继承
public:
    using Base::bn1;	//在当前作用域中引入了父类的保护成员, 在当前作用域中可以访问
};
 
class DerivedAgain: public Derived{	//在Derived的子类中仍然可以访问bn1
};
 
int main(){
    Derived d;
    DerivedAgain da; 
    d.bn1 = 1;
    d.bn2 = 2;   //error, 'bn2' is a private member of 'Base'
    da.bn1 = 3;  //ok
    std::cout<<d.bn1<<std::endl;
    return 0;
}

尽管Derived是Base的私有继承,但是通过using声明父类的成员,我们就可以在Derived类以及其后续派生类中使用了。

2. using指示(引入命名空间)

using指示就是将一个命名空间中的所有名字全部引入到当前作用域(将命名空间在当前作用域展开)。可能会存在命名冲突的问题。

using namespace std;	//我们常用的std命名空间展开

3. 类型重定义(替代typedef)

语法:

using alias = typename;//使用别名去替代原始类型(重命名)

在C++11中,我们可以使用这样的语法来替代typedef的功能了。

using ULL = unsigned long long;		//typedef unsigned long long ULL;
using func = void(*)(int, int);		//typedef void(*func)(int, int);

在Effective Modern C++中的条款9说明了, 使用using替代typedef

typedef存在一些限制。

当我们想实现一个这样的模板: 将一个int映射到任意类型的模板。类似于下面的功能:

typedef std::map<int, int> mapIntInt;
typedef std::map<int, bool> mapIntBool;
typedef std::map<int, std::string> mapIntString;
//...

在C++98/03中,我们必须这样写才能实现:

template <class Val>
struct mapInt{
    typedef std::map<int, Val> type;
};

int main(){
    mapInt<int>::type imap;		//将int映射到int的
    mapInt<bool>::type bmap;	//将int映射到bool的
    mapInt<std::string>::type smap;	//将int映射到string的
    return 0;
}

在C++11中,我们可以直接使用using重定义模板

template <class Val>
using mapInt = std::map<int, Val>;

int main(){
    mapInt<int> imap;
    mapInt<bool> bmap;
    mapInt<std::string> smap;
    return 0;
}

总结

到此这篇关于C++中using的三种用法的文章就介绍到这了,更多相关C++ using用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现访问者模式的基础介绍

    C++实现访问者模式的基础介绍

    访问者模式表示一个作用于某对象结构中各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。对C++访问者模式相关知识感兴趣的朋友一起看看吧
    2021-09-09
  • C语言代码实现推箱子小游戏

    C语言代码实现推箱子小游戏

    这篇文章主要为大家详细介绍了C语言代码实现推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++实现矩阵对称正交化的示例代码

    C++实现矩阵对称正交化的示例代码

    这篇文章主要介绍了C++实现矩阵对称正交化,分为python代码和C++的eigen库实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 关于C++对象继承中的内存布局示例详解

    关于C++对象继承中的内存布局示例详解

    这篇文章主要给大家介绍了关于C++对象继承中内存布局的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • 基于C语言实现简易的扫雷游戏

    基于C语言实现简易的扫雷游戏

    这篇文章主要为大家详细介绍了基于C语言实现简易的扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C语言判断一个数是否是2的幂次方或4的幂次方

    C语言判断一个数是否是2的幂次方或4的幂次方

    本文中我们来看一下如何用C语言判断一个数是否是2的幂次方或4的幂次方的方法,并且判断出来是多少次方,需要的朋友可以参考下
    2016-06-06
  • 关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 利用Matlab制作环形相册效果详解

    利用Matlab制作环形相册效果详解

    这篇文章主要为大家介绍了如何利用Matlab制作出环形相册的效果,文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下
    2022-03-03
  • 数据结构 双向链表的创建和读取详解及实例代码

    数据结构 双向链表的创建和读取详解及实例代码

    这篇文章主要介绍了数据结构 双向链表的创建和读取详解及实例代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • C++中拷贝构造函数的总结详解

    C++中拷贝构造函数的总结详解

    深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝
    2013-09-09

最新评论