首页 > 编程语言 >【C++】using

【C++】using

时间:2024-08-11 18:19:49浏览次数:10  
标签:std map typedef int C++ using

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

1、using 声明

using 声明 (using declaration) 是将命名空间中单个名字注入到当前作用域的机制,使得在当前作用域下访问另一个作用域下的成员时无需使用限定符 ::

// ...
{
    using std::map
    map<int, std::string> the_map; //ok
}
map<int, std::string> the_map2;  //error

using 声明将其它 namespace 的成员引入本命名空间的 当前作用域 (包括其嵌套作用域) 。一个 using 声明一次只引入一个命名空间成员,它使得无论程序中使用哪些名字,都非常准确。
利用 using 声明,可以改变派生类对父类成员的访问控制:

class Base{
protected:
    int bn1;
    int bn2;
};
 
class Derived: private Base{
public:
    using Base::bn1;
};
 
class DerivedAgain: public Derived{
};
 
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 中访问其成员,且后续的继承同样不受 private 限定的影响。

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

using 指示 (using directive) 是使一个命名空间中的 所有 名字都在该作用域中可见的机制。这是最常用的方式了。需要注意的是命名冲突问题。

#include <iostream>
namespace n1{ 
    int n1_member = 10; 
    int m = 11; 
}
 
int m = 12; 
 
int main(){
    using namespace n1; 
    std::cout<<n1_member<<std::endl;
    //std::cout<<m<<std::endl;  //error 命名冲突
    std::cout<<::m<<std::endl;
 
    int m = 13; //ok, 局部变量屏蔽命名空间变量
    std::cout<<m<<std::endl;
 
    return 0;
}

Notice: 尽管 using指示很方便,但在实际工作中应该尽量避免:它一下子将另一个 namespace 中的成员全部引入了,一不小心就会出现命名空间污染问题。

3、类型重定义,取代 typedef

using alias = typename

这是 C++11 中的新用法,比 typedef 更能表达别名的定义。

using fun = void (*)(int, int);
//typedef void (*fun)(int, int); //与上一句等价
using int16 = short;
//typedef short int16; //与上一句等价
 
int main(){
    std::cout<<sizeof(int16)<<std::endl;
}

在 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;
//... Others

我们在 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;
}

标签:std,map,typedef,int,C++,using
From: https://www.cnblogs.com/servlet-context/p/18353692

相关文章

  • 【C++】typeid与RTTI
    1、简介注意:typeid是操作符,不是函数。这点与sizeof类似)运行时获知变量类型名称,可以使用typeid(变量).name()需要注意不是所有编译器都输出”int”、”float”等之类的名称,对于这类的编译器可以这样使用。intia=3;if(typeid(ia)==typeid(int)){cout<<"int"<<e......
  • 【C++学习笔记 16】构造函数初始化列表
    当编写类并向其中添加成员时,通常需要某种方式对这些成员进行初始化。常见的方法,如写一个构造函数赋初值classEntity{private: std::stringm_Name;public: Entity(){ m_Name="UnKnow"; } Entity(conststd::string&name){ m_Name=name; } constst......
  • C++快速理解之面向对象
    文章目录1、定义类2、创建对象3、使用.访问成员4、使用->访问成员5、this指针6、构造函数7、析构函数8、重载对象C++中的类(Class)可以看做C语言中结构体(Struct)的升级版类是一个通用的概念,C++、Python、C#、PHP等很多编程语言中都支持类,都可以通过类创建对象......
  • Linux C++ 多线程编程
    LinuxC++多线程编程参考教程:c++:互斥锁/多线程的创建和unique_lock<mutex>的使用_mutex头文件vc++-CSDN博客1.编写unique_mutex1.1创建文件夹通过终端创建一个名为unique_mutex的文件夹以保存我们的VSCode项目,在/unique_mutex目录下打开vscode。rosnoetic@rosnoetic-Virt......
  • C++入门基础知识9
    C++中的分号&语句块在C++中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。例如,下面是三个不同的语句: 语句块是一组使用大括号括起来的按逻辑连接的语句。例如: C++不以行末作为结束符的标识,因此,您可以在一行上放置多个语句......
  • C++ call_once详解
    引言在多线程编程中,常常需要确保某些初始化操作只执行一次,例如初始化一个全局资源或单例模式中的实例创建。C++11引入了std::call_once和std::once_flag,为这种需求提供了便捷和高效的解决方案。一、基本概念1.std::call_oncestd::call_once是一个函数模板,它确保某个函数在......
  • C++11新特性
    C++11新特性语言特性移动语义右值引用转发引用可变模板列表初始化静态断言类型推导lambda表达式decltype类型声明nullptr空指针强类型枚举属性constexpr常量表达式委托构造用户定义语义显式虚重载Final限定符:限定的东西无法......
  • C++20新特性
    C++20新特性语言特性协程concept概念指定初始化器lambda表达式模板语义范围for循环增加初始化器[[likely]][unlikely]属性废弃隐式捕获this非类型模板参数的类类型constexpr虚函数explict(bool)立即函数usingenums,能直接进行using了lambda捕获参数包char8_t类型......
  • visual studio code安装与C/C++语言运行
    VisualStudioCode(VSCode)安装与C/C++语言运行需要几个步骤,包括安装VSCode、配置C/C++环境以及安装必要的插件。以下是一个详细的步骤指南:1.安装VSCode访问官网:首先,前往VSCode的官方网站 VisualStudioCode-CodeEditing.Redefined 进行下载。下载并安装:选择......
  • c++的类和对象(中):默认成员函数与运算符重载(重难点!!)
    前言 Hello,小伙伴们,我们今天继续c++的学习,我们上期有介绍到c++的部分特性,以及一些区别于c语言的地方,今天我们将继续深入了解c++的类和对象,探索c++的奥秘。好,废话不多说,开始我们今天的学习。 1.类默认成员函数默认成员函数就是用户没有显示实现,编译器会自动生成的函数称......