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

C++面试题:C++中 using 和 typedef 有什么区别?

在 C++中,usingtypedef 都可以用于定义类型别名,但它们在语法和功能上有一些关键区别:

1. 语法形式

typedef(传统方式):语法为 typedef 原类型 新类型名,例如:

这里:

原类型void (*)(int, int)(函数指针类型)。

新类型名FuncPtr 被嵌入到原类型的变量名位置。

函数指针的声明语法本身要求变量名(或类型别名)必须出现在 (* ) 中间

using(C++11 引入):语法为 using 新类型名 = 原类型,例如:

2. 模板别名(Template Aliases)

这是两者最大的区别:

typedef无法直接定义模板别名,需要包裹在结构体中:

using支持模板别名(C++11 特性):

3. 作用域和可读性

using更灵活:在定义复杂类型(如嵌套模板、函数指针)时,using 的语法更清晰:

无论是 using 还是 typedef,定义的类型别名都遵循标准的作用域规则:

全局作用域:定义在全局命名空间中。

局部作用域:定义在函数、代码块内。

类作用域:定义在类或结构体内。

// 全局作用域
typedef int GlobalInt;
using GlobalIntAlias = int;

class MyClass {
public:
    // 类作用域
    typedef double ClassDouble;
    using ClassDoubleAlias = double;

    void func() {
        // 局部作用域
        typedef char LocalChar;
        using LocalCharAlias = char;
    }
};

3. using的其他用法

using 的关键字功能不仅限于定义类型别名,还可以在以下场景中操作作用域:

引入命名空间成员
将某个命名空间的成员引入当前作用域,避免重复写命名空间前缀。

namespace NS {
    void foo() {}
    int value = 42;
}

int main() {
    using NS::foo;  // 将 NS::foo 引入当前作用域
    using NS::value;

    foo();          // 直接调用 NS::foo()
    return value;   // 直接使用 NS::value
}

类继承中的基类成员引入

在类的继承中,using 可以将基类的成员(如函数、类型别名)引入派生类的作用域,解决名称隐藏问题(Name Hiding)。

class Base {
public:
    void func(int x) {}
    typedef int BaseType;
};

class Derived : public Base {
public:
    using Base::func;  // 引入基类的 func(int)
    using Base::BaseType; // 引入基类的类型别名

    void func(double y) {} // 派生类定义同名函数
};

int main() {
    Derived d;
    d.func(10);    // 调用基类的 func(int)(若没有 using 声明,会被派生类的 func(double) 隐藏)
    d.func(3.14);  // 调用派生类的 func(double)
}

用途
解决派生类成员函数隐藏基类同名函数的问题。

引入基类的类型别名(如 typedefusing 定义的类型)。

引入基类构造函数

C++11 允许通过 using 在派生类中继承基类的构造函数:

#include <iostream>

class Base 
{
public:
    Base(int x) 
    {
        std::cout << "Base" << std::endl;
    }
};

class Derived : public Base 
{
public:
    using Base::Base; // 继承基类的构造函数
};

int main() 
{
    Derived d(42);  // 调用继承自 Base 的构造函数 Base(int)

    return 0;
}

总结

特性typedefusing
语法原类型在前,新类型名在后新类型名 = 原类型
模板别名不支持(需包裹结构体)直接支持
复杂类型可读性一般更清晰
兼容性兼容 C 和 C++仅 C++11 及以上

在 C++11 及更高版本中,优先使用 using,尤其是涉及模板时。typedef 仅在需要兼容旧代码时使用。

相关文章:

  • n8n - AI自动化工作流
  • word使用自带的公式
  • # WebSocket 与 Socket.IO 对比与优化
  • 每日一题-力扣-2829. k-avoiding 数组的最小总和 0326
  • HCIP(TCP)(2)
  • macOS 制作dmg磁盘映像安装包
  • SSL/TLS加密
  • vue 中渲染 markdown 格式的文本
  • RTOS实现Try-Catch机制,支持CM3/4/7
  • 【R语言可视化】相关系数热图
  • RAGFlow如何迁移到新机器
  • 批量提取 PPT 文档幻灯片中的备注到单独的文件
  • 26考研——栈、队列和数组_队列(3)
  • 前端知识点---用正则表达式判断邮箱(javascript)
  • langgraph的使用
  • TypeScript 与 JavaScript 对比
  • 雪花算法生成分布式唯一ID
  • (UI自动化测试web端)第二篇:元素定位的方法_css定位之层级选择器
  • LangChain4j与DashScope深度集成实战:一站式开发指南
  • 当 0 编程基础,用 ChatGPT 和 Cursor 开发同一应用时… |AI 开发初体验
  • 油金地 做网站/网络推广协议
  • 公司想为一个产品做多个网站/网址收录平台
  • 手机网站建设推广方案ppt模板/不能搜的超级恶心的关键词
  • 南通优化网站排名/成人电脑速成培训班
  • 龙华网站建设yihe kj/如何修改百度上面的门店号码
  • 在线A视频网站 一级A做爰片/今日新闻十大头条内容