当前位置: 首页 > article >正文

什么是 C++ 中的类型别名和 using 声明?如何使用类型别名和 using 声明?

一、类型别名

  • 类型别名是一个现有类型的另一个名称。它可以让代码更加清晰易读,特别是在处理复杂类型时。在 C++ 中,可以使用typedef关键字或using关键字来定义类型别名。

1. 使用typedef定义类型别名

typedef 类型 别名
typedef int MyInt;
MyInt a = 10;
  • MyIntint的类型别名。现在可以使用MyInt来声明变量,就像使用int一样。

2. 使用using定义类型别名

using 别名 = 类型
using MyInt = int;
MyInt b = 20;
  • 类型别名的作用不仅仅局限于基本数据类型。它还可以用于复杂类型,如指针、引用、数组和函数指针等。
typedef int* IntPtr;
using MyFunc = void (*)(int);
  • IntPtrint指针的类型别名,MyFunc是一个指向函数的指针类型别名,该函数接受一个int参数无返回值。

二、using声明

  • using声明是用于将一个命名空间中的特定名称引入到当前作用域中,使得在当前作用域中可以直接使用该名称进行访问,而无需加上命名空间限定符。

1.基本用法

  • 假设存在一个命名空间 myNamespace
namespace myNamespace {
    void func() {
        std::cout << "Function in namespace." << std::endl;
    }
}
  • 可以使用 using 声明将 myNamespace::func 引入到当前作用域:
using myNamespace::func;

int main() {
    func();
    return 0;
}
  • 在 main 函数中,就可以直接调用 func,而无需加上命名空间限定符 myNamespace::func

2.引入命名空间中的特定类型

namespace myNamespace {
    class MyClass {
    public:
        void print() {
            std::cout << "MyClass in namespace." << std::endl;
        }
    };
}

using myNamespace::MyClass;

int main() {
    MyClass obj;
    obj.print();
    return 0;
}
  • 这里通过 using 声明引入了 myNamespace 中的 MyClass,可以在当前作用域中直接使用该类型。

3.与模板结合使用

namespace myNamespace {
    template<typename T>
    void templateFunc(T value) {
        std::cout << "Template function in namespace: " << value << std::endl;
    }
}

using myNamespace::templateFunc;

int main() {
    templateFunc(10);
    templateFunc("Hello");
    return 0;
}
  • 这里通过 using 声明引入了命名空间 myNamespace 中的模板函数 templateFunc,可以在当前作用域中直接调用该模板函数。

注意:

  • 谨慎使用 using 声明,尤其是在引入多个命名空间中的同名实体时,可能会导致命名冲突。
  • 如果引入的名称与当前作用域中已有的名称冲突,会导致编译错误。在这种情况下,可以考虑使用别名或更明确的命名来避免冲突。
namespace ns1 {
    void func() {
        std::cout << "Function from ns1." << std::endl;
    }
}

namespace ns2 {
    void func() {
        std::cout << "Function from ns2." << std::endl;
    }
}

int main() {
    using func1 = ns1::func;
    using func2 = ns2::func;
    func1(); // 调用 ns1 中的 func
    func2(); // 调用 ns2 中的 func
    return 0;
}
  • 在这个例子中,使用类型别名将两个命名空间中的 func 分别命名为 func1 和 func2,从而避免了命名冲突。

http://www.kler.cn/a/408285.html

相关文章:

  • JAVA实现将PDF转换成word文档
  • 社交电商专业赋能高校教育与产业协同发展:定制开发AI智能名片及2+1链动商城小程序的创新驱动
  • 【数据结构 | C++】部落
  • Unity图形学之Surface Shader结构
  • 若依-一个请求中返回多个表的信息
  • MySQL面试题补
  • Ultiverse 和web3新玩法?AI和GameFi的结合是怎样
  • RT-DETR融合[ECCV 2018]RCAN中的RCAB模块及相关改进思路
  • 《C++智能合约与区块链底层交互全解析:构建坚实的去中心化应用桥梁》
  • 微知-lspci访问到指定的PCIe设备的几种方式?(lspci -s bus;lspci -d devices)
  • Leetcode 每日一题 15.三数之和
  • Spring Boot OA:构建企业级办公自动化平台
  • 深入解析 EasyExcel 组件原理与应用
  • 基于RFSOC实现LFMCW雷达测距测速
  • IP-Adapter 开源项目介绍
  • 小程序-基于java+SpringBoot+Vue的流浪动物救助小程序设计与实现
  • 开发工具 - VSCode 快捷键
  • [产品管理-105]:制造业 VS 创造业, 1->N VS 0->1, 一致性 VS 创新性
  • Python内置数据结构:列表篇:【】,list函数创建。列表创建常见遇到问题,索引,列表增删改查,常用函数,while,for进行列表遍历,列表推导式
  • 单片机学习笔记 11. 外部中断
  • 设计模式-创建型-建造者模式
  • 设计模式——前端控制器模式
  • 用 Python 从零开始创建神经网络(九):反向传播(Backpropagation)
  • 【前端】JavaScript 作用域全面解析
  • 【动态规划】“好数组”计数问题
  • y1重定义问题