C++ using的用法

C++基础之关键字——using使用详解 目前为止C++中的using关键字主要有三中使用场景,从C++ 11开始新增了第三种。下面我们分别介绍一下。 指示使用某命名空间,对命名空间成员进行声明也就是说指明用哪个命名空间的成员 Using-directives:指示使用某命名空间,这也是最常见的使用方法 语法: attr(optional) using namespace nested-name-specifier(optional) namespace-name; attr: 应用到using的任意数量的属性, nested-name-spe 阅读详情

using 关键字是 C++11 引入的一项强大特性,它可以用于 类型别名、继承成员 和 别名模板 等不同的场景。在 C++ 中,using 为代码提供了更多的灵活性和可读性。


1. 类型别名(Type Aliases)

using 可以用来创建类型别名,通常与 typedef 功能相似,但语法上更简洁和直观。

1.1 基本类型别名
using IntPtr = int*;  // 创建类型别名 IntPtr,等价于 int* 类型
IntPtr p = nullptr;   // 使用 IntPtr 作为 int* 类型的别名
  • 这里,我们创建了一个 指向整数的指针类型 IntPtr,等价于 int*。
  • 这种方式比 typedef 更具可读性,尤其是在复杂类型的情况下。
1.2 复杂类型别名
using StringMap = std::map<std::string, std::string>;
StringMap myMap;  // 使用类型别名 StringMap 来定义一个 std::map
  • StringMap 是对 std::map<std::string, std::string> 的别名,使得代码更加简洁和易懂。
1.3 函数指针别名
using Callback = void(*)(int);  // 定义一个函数指针别名 Callback,指向接收 int 参数并返回 void 的函数
Callback func = print;          // 将一个符合签名的函数赋给 func
  • Callback 是一个 函数指针类型,指向 接受 int 参数并返回 void 的函数。using 使得这段代码更加简洁易懂。
1.4 模板类型别名
template <typename T>
using Vec = std::vector<T>;  // 创建模板类型别名 Vec,表示 std::vector<T>
Vec<int> numbers;             // 使用 Vec<int> 来定义一个存储整数的向量
  • 这里的 Vec 是一个模板类型别名,它简化了 std::vector<T> 的写法,方便代码的书写和维护。

2. 继承成员(继承类成员)

在 C++ 中,类成员(特别是继承自基类的成员)默认是不可访问的,如果你想让派生类访问基类的某些成员,可以使用 using 来显式地继承基类的成员。

2.1 继承构造函数
class Base {
public:
    Base(int x) { std::cout << "Base: " << x << std::endl; }
};

class Derived : public Base {
public:
    using Base::Base;  // 继承基类的构造函数
    void print() { std::cout << "Derived class" << std::endl; }
};

int main() {
    Derived d(10);  // 调用基类的构造函数
    d.print();
    return 0;
}
  • 通过 using Base::Base;,我们显式地 继承了 Base 类的构造函数,这样在派生类中我们就可以直接调用基类的构造函数了。
2.2 继承基类的成员函数
class Base {
public:
    void foo() { std::cout << "Base foo()" << std::endl; }
};

class Derived : public Base {
public:
    using Base::foo;  // 继承 Base 的 foo 方法
    void bar() { std::cout << "Derived bar()" << std::endl; }
};

int main() {
    Derived d;
    d.foo();  // 调用 Base 类的 foo 方法
    d.bar();  // 调用 Derived 类的 bar 方法
    return 0;
}
  • using Base::foo; 使得 Derived 类能够访问 Base 类的 foo() 方法。

3. 别名模板(Alias Templates)

using 可以用来为模板定义别名,使模板的使用更加简洁,尤其是对于泛型编程和标准库类型的使用。

3.1 模板别名
template <typename T>
using Ptr = T*;  // 为指针类型定义别名

int main() {
    Ptr<int> p = nullptr;  // 使用 Ptr<int> 作为 int 类型的指针
}
  • Ptr<T> 只是 T* 的别名,简化了指针类型的定义。
3.2 复杂模板别名
template <typename T>
using Map = std::map<std::string, T>;  // 定义一个模板别名,表示以 std::string 为键,T 为值的 map

Map<int> myMap;  // 使用 Map<int> 来定义一个键为 std::string,值为 int 的 map
  • Map<T> 是一个模板别名,表示键为 std::string,值为 T 的 std::map。

4. using 与 typedef 对比

using 和 typedef 都可以用来定义类型别名,但 using 比 typedef 更简洁且更强大,尤其是在模板类型别名中。

4.1 typedef 的用法
typedef int* IntPtr;  // 使用 typedef 创建类型别名 IntPtr,等价于 int* 类型
IntPtr p = nullptr;
4.2 using 的用法
using IntPtr = int*;  // 使用 using 创建类型别名 IntPtr,等价于 int* 类型
IntPtr p = nullptr;
  • using 更简洁,且在模板类型别名中表现得更好。
4.3 模板类型别名的对比

typedef:

typedef std::vector<int> IntVector;  // 使用 typedef 创建类型别名

using:

using IntVector = std::vector<int>;  // 使用 using 创建类型别名
  • typedef 语法较为繁琐,而 using 使得语法更加简洁。

5. 总结

  • 类型别名:using 让我们可以为复杂类型(如函数指针、模板类型等)创建简洁的别名,提高代码的可读性和可维护性。
  • 继承成员:using 关键字可以用来继承基类的构造函数或成员函数,使得派生类能够直接使用这些成员。
  • 别名模板:using 在模板类型别名方面比 typedef 更加灵活和简洁,特别是在泛型编程中。
  • 与 typedef 的对比:using 语法简洁,特别适用于模板类型别名,已经成为现代 C++ 中推荐的做法。

通过这些功能,using 能够帮助我们在代码中减少冗余,增加灵活性,尤其在处理复杂类型时,能使代码更加简洁明了。

【AutoDL + Langchain-Chatchat】从零构建高效本地 RAG 知识库问答系统:实战保姆级教程(含避坑指南) 本文详细阐述如何在AutoDL云平台,如何利用Langchain-Chatchat构建高效的本地RAG知识库问答系统,并深入解析RAG架构。从环境搭建到实战部署,从问题排查到性能优化,提供一份全面实用的指南,助力开发者快速构建智能问答应用。 阅读详情

相关推荐

Unity资源逆向解析:从APK到AssetStudio的完整实战

本文详细介绍了Unity资源逆向解析的全流程,从APK解包到使用AssetStudio深度解析Unity游戏资源。通过实战案例演示如何提取《植物大战僵尸》等游戏的素材,包括贴图、音频和3D模型,帮助开发者掌握Unity游戏逆向工程的核心技术。

weixin_30664051的博客 469

C++ using的三种用法详解

1. using声明(引入单个名称)、2. using指示(引入命名空间)、3. 类型重定义(替代typedef)

wuqiongjin的博客 1万+

通达信【雷霆尊者排序】实战指南:高胜率竞价指标解析与优化策略

本文详细解析了通达信【雷霆尊者排序】指标在集合竞价阶段的应用,提供从基础设置到实战解码的完整指南。文章重点剖析了‘雷霆’、‘使者’、‘精选’等核心信号的逻辑与共振策略,并分享了如何结合K线、市场情绪进行综合研判与风险控制,旨在帮助短线交易者提升早盘选股效率与胜率。

pear55的博客 920

C++中using的三种用法

1、导入命名空间 C++命名空间namespace的理解 使用C++在写不同的功能模块时,为了防止命名冲突,建议对模块取命名空间,这样在使用时就需要指定是哪个命名空间。 使用 using 导入命名空间,即使一个命名空间中的所有名字都在该作用域中可见,常见的如下: // 导入整个命名空间到当前作用域 using namespace std; // 只导入某个变量到当前作用域 using std::cout; 在.h头文件中,一般不应该使用using声明。 因为头文件的内容会拷贝...

juruiyuan111的专栏 2699

Lattice FPGA 开发工具Diamond使用流程总结——工具使用

本文介绍了一般的Diamond开发流程,包括工程创建、文件输入、IP使用、约束、管脚分配、和布线布局等流程

weixin_41895751的博客 2万+

音视频入门:H264、H265概念总结

添加链接描述 什么是H.264与H.265 H.264与H.265都是视频压缩格式,由于视频本身的码流太大,所以需要经过压缩然后再通过网络进行传输。H.264是目前比较主流的压缩算法,像视频会议设备一般都采用这个编码格式。基础的H.264可以支持在1M带宽下传输720P30帧/秒的图像;H.264 HIGH PROFILE支持在512K带宽下传输720P30帧/秒的图像。 H.265是比较新的压缩算法,可以更一步提高压缩比,随着我们现在生活中出现的视频格式越来越大(比如现在基本都是1080P甚至4K的显示器

weixin_40673765的博客 8927

C++ 中using 的使用

若不是特别熟悉函数指针与typedef的童鞋,我相信第一眼还是很难指出FP其实是一个别名,代表着的是一个函数指针,而指向的这个函数返回类型是void,接受参数是int, const std::string&。我想,即使第一次读到这样代码,并且不知道 C++11 using 用法的童鞋也能很容易知道 FP 是一个别名,using 的写法把别名的名字强制分离到了左边,而把别名指向的放在了右边,比较清晰。今天在看vector.h的时候,碰到一个using的奇怪用法,才疏学浅之前没有碰到过,整理一下。

私房菜 10万+

KUKA-外部自动运行模板程序——个人设计模式&思路

用于说明KUKA与西门子PLC外部自动交互模板的设计思路与使用流程

qq_39024187的博客 5570

C++:using : using的四大用法总结

C++:using : using的四大用法总结

C++ JAVA的专栏 2859

STM32巡线小车PID调参实战:从五路灰度传感器数据到稳定运行的避坑指南

本文详细介绍了STM32巡线小车的PID调参实战,从五路灰度传感器数据处理到PID参数优化,提供了系统化的调试方法和常见问题解决方案。通过加权平均法计算偏移量,逐步调整比例、积分、微分参数,实现小车稳定巡线。文章还涵盖了定时器配置、控制周期优化及高级调试技巧,帮助开发者避开常见陷阱,提升巡线性能。

weixin_42570484的博客 191

什么是OAuth 2.0?

OAuth2.0是一种授权协议而非登录协议,核心思想是通过令牌(Token)而非密码实现安全授权。它涉及三个关键角色:用户、第三方应用和身份提供商(IdP)。最常用的授权码流程(AuthorizationCode Flow)通过浏览器三方对话,确保用户密码只提供给IdP而非第三方应用。OAuth2.0提供四种授权方式,其中授权码和客户端凭证是当前主流,而隐式和密码模式已不推荐。需要注意的是,OAuth2.0解决的是授权问题,身份认证需通过OpenID Connect实现。该协议通过临时令牌机制,实现了&qu

sonadorje的专栏 1146

C++ using用法总结

C++ using用法总结 1)配合命名空间,对命名空间权限进行管理 using namespace std;//释放整个命名空间到当前作用域 using std::cout; //释放某个变量到当前作用域 2)类型重命名 作用等同typedef,但是逻辑上更直观。 #include <iostream> using namespace std; #define DString std::string //! 不建议使用!typedef std::string TString; /

qq_18059143的博客 787

Pyhon在振动信号处理中的高级应用(一):振动信号特征(时域、频域)提取

文章目录一、概述二、算法原理2.1 时域统计特征三、python代码实现 一、概述 二、算法原理   这里我们借鉴西安交通大学机械学院雷教授的论文《Fault diagnosis of rotating machinery based on multiple ANFIS combination with GAs》相关研究成果。雷教授在论文中共列举了4类共24种振动信号的时域和频域特征。 2.1 时域统计特征 p1=∑n=1Nx(n)NP2=∑n=1N(x(n)−p1)2N−1p3=(∑n=1N∣x(n)∣N

白银时代的博客 1万+

C++ using用法

参考: C++ using用法

weixin_41888257的博客 360

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

c++中using的几种用法

最近在使用中,发现了一种以前没学过的using用法,于是在这里,将using的几种用法总结一下。 先来说说我新学会的一种用法,就是起别名,我们都知道typedef可以给我们起别名,using也可以,用法如下 1.using a = pair<int,int>,类似于这样的用法。 当然还有我们熟知的几种用法 2.可以引入命名空间 using namespace std ; u...

hgxy123的博客 5867

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

c++ using用法

三种情况: 命名空间 在子类中引用基类成员 别名指定 命名空间: using namesapce std; #... #... 在子类中引用基类成员 #include<string> #include<iostream> using namespace std; class My{ public: My() {}; void fun() { std::cout << "my::fun()" << std::endl; }; void fun(

lin 510

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++中你不知道的namespace和using的用法

你是不是只认为namespace 和 using 在C++中是基本的语法框架,但是却不知道它们的真正用法,看完文章你会对using和namespace有一定了解,帮助你深入学习C++注意: 当using声明的标识符和其他同名标识符有作用域的冲突时,会产生二义性。:: 运算符是一个作用域,如果::前面什么都没有加 代表是全局作用域。namespace 本质是作用域,可以更好的控制标识符的作用域。命名空间 就可以存放 变量 函数 类 结构体 ...也就是如果你输入的数前加了:: 代表是全局变量。

莫浅子的博客 2万+

C++11using用法

C++11中using关键字的主要作用是:为一个模板库定义一个别名。 下面列举出using的几种用法: /*定义别名*/ template<class T> using Tlist = std::list<T>; using Tlist = std::list<char>; Tlist listChar; //typedef void(*...

weixin_42067873的博客 3232

C++中 using的用法小结

using 用法一:命名空间 为了避免代码冲突,一般会用命名空间。例如: namespace MyTinySTL; 在编码中可以用MyTinySTL::具体的类方法。也可以直接使用: using namespace MyTinySTL; using MyTinySTL::具体类方法; using 用法二 :引用基类成员 在子类中引用基类的成员。 先看下source code: class Base...

weixin_37910058的博客 817

c++中using的用法

1、概述 我们用到的库函数基本上都属于命名空间std的,在程序使用的过程中要显示的将这一点标示出来,如std::cout。这个方法比较烦琐,而我们都知道使用using声明则更方便更安全。 这个我们程序员肯定都知道了,今天突发奇想就想对using整理一下。 2、命令空间的using声明 我们在书写模块功能时,为了防止命名冲突会对模块取命名空间,这样子在使用时就需要指定是哪个命名空间,使用using声...

weixin_39640298的博客 3万+

C++中using 用法

中文解析:定义一个类型别名模板 `MyMap` ,将 `std::map` 模板实例化为 `MyMap` ,可以使用 `MyMap` 作为 `std::map` 的别名。中文解析:定义一个模板别名 `MyVector` ,将 `std::vector` 模板实例化为 `MyVector` ,可以使用 `MyVector` 作为 `std::vector` 的别名。它们可以用于简化代码、提高可读性和灵活性。

987

C++中 using 命名别名和命名别名模板的用法

using 的取名别用法

ComputerInBook的专栏 916

using c++11中的不同用法

碰到一个using的奇怪用法,才疏学浅之前没有碰到过,整理一下。 来看下source code: template<class _Ty, class _Alloc = allocator<_Ty>> class vector : public _Vector_alloc<_Vec_base_types<_Ty, _Alloc&...

xmmdbk的博客 312

C++中关于using的两种用法

using两种特殊用法 最近看ap代码,遇到了关于using的写法,代码如下,查了半天没找到ClientSocket(handle)是个什么东西。。。 class StreamSocket : public ClientSocket { explicit StreamSocket(int handle) : ClientSocket(handle) {} } class ClientSocket : public Socket { public: using Socket::Socket; pro

weixin_44537992的博客 1307

C++中using的三种用法:

C++中using的三种用法: C++

Kp0fS的草稿纸 1592
上一篇: 回调函数(Callback Function)
下一篇: C++深拷贝\浅拷贝
TsuanS
博客等级 码龄4年 274粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值