【C/C++基础进阶系列】C/C++ 常见知识点总结
发布日期:2021-05-07 20:53:01 浏览次数:22 分类:精选文章

本文共 1931 字,大约阅读时间需要 6 分钟。

【C/C++基础进阶系列】C/C++ 常见知识点总结

【1】offsetof 宏

在C++中,offsetof 宏用于获取结构体中特定成员字段相对于结构体起始位置的偏移量(以字节为单位)。其工作原理如下:

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER)

该宏通过以下步骤实现功能:

  • (TYPE*)0:将数字0转换为指向TYPE类型的指针,表示从内存地址0开始的sizeof(TYPE)字节内存储一个TYPE类型的变量。
  • ((TYPE*)0)->MEMBER:获取该结构体变量中的MEMBER成员变量。
  • &(((TYPE*)0)->MEMBER:使用取地址运算符&获取MEMBER成员变量的地址。
  • (size_t):将地址强制转换为size_t类型。
  • 因此,offsetof宏返回的是MEMBER成员在内存中的实际地址,这也正是MEMBER成员相对于结构体首地址的偏移量。


    【2】char *schar s[] 的区别

    在C++中,char *s = "hello"char s[] = "hello" 的主要区别在于变量的可修改性和存储方式:

  • char *s = "hello":声明了一个指向char类型的常量指针。在使用时,不能修改该指针指向的内存内容,因为char *s是指针类型且被const修饰。
  • char s[] = "hello":声明了一个char类型的数组变量。在使用时,可以通过修改数组内容来改变字符串值。
  • 作为函数形式参数时,char *schar s[] 没有区别,因为它们都会被拷贝。


    【3】左值和右值

    在C++中,左值和右值的概念如下:

    • 左值:指可以出现在等号左边的变量或表达式。左值可以对其进行取地址操作,通常是具有名字且持久存在的对象。
    • 右值:指可以出现在等号右边的变量或表达式。右值不能取地址,通常是临时对象或字面量。

    右值的子类包括:

    • 将亡值(xvalue):生命期即将结束的值,通常与右值引用相关。
    • 纯右值(prvalue):按值返回的临时对象、运算结果或原始字面量。

    右值引用与左值引用主要区别在于:

    • 右值引用可以读取和修改数据,且在编译时生成临时量。
    • 左值引用只能读取数据,且在运行时生成临时量。

    【4】C++ 聚合类

    聚合类是C++中一种特殊的类,其特点如下:

  • 所有成员都必须是public
  • 类必须没有定义构造函数。
  • 类必须没有类内初始值。
  • 类不能继承自其他类,也不能有虚函数。
  • 聚合类支持以下特性:

    • 提供一个花括号扩起来的成员初始值列表,用于初始化聚合类的数据成员。
    • 初始值的顺序必须与成员声明的顺序一致,若初始值列表的元素个数少于类成员数量,则后续成员会被默认初始化。

    例如:

    aggregate int a, int b = 10;

    【5】reinterpret_cast, const_cast, static_cast, 和 dynamic_cast

    这四个_cast关键字用于类型转换,具体功能如下:

  • reinterpret_cast:用于无关类型之间的转换,按比特级别进行操作。常用于指针、函数指针或枚举类型之间的转换。

  • const_cast:用于移除constvolatile限定符。例如:

  • const_cast
    (expression)
    1. static_cast:用于静态类型转换,无运行时类型检查。常用于基类与派生类之间的转换。

    2. dynamic_cast:用于动态类型转换,具备运行时类型检查。常用于类层次结构中的上行和下行转换。


    3. 【6】constconstexpr 关键字

      const 修饰符

      • 用于修饰变量、指针和引用,表示它们的值不能被修改。
      • 对于指针,可以修饰指针本身或指针所指对象的类型。
      • 对于函数参数和返回值,const 的作用是防止意外修改。

      constexpr 关键字

      • constexpr 表示在编译期可求值的常量表达式。
      • 可用于修饰构造函数,确保所有成员变量在编译期初始化。
      • 适用于只能使用常量表达式的场景。

      【7】noexcept 关键字

      用途

      • 用于声明一个函数不会抛出异常。
      • 编译器不会生成异常处理代码,减少运行时开销。

      示例

      void func() noexcept;

      【8】explicit 关键字

      • explicit 用于修饰构造函数,表示构造函数不能进行隐式类型转换。
      • 只有当构造函数有一个参数或具有默认值(除了第一个参数)时,才能进行类型转换。

      总结

      以上是C/C++基础进阶系列中的一些关键知识点。如果需要进一步学习,可以查阅相关教材或在线资源。

    上一篇:【网络通信 -- 直播】WebRTC -- 多人音视频通讯架构与主流服务器简介
    下一篇:【网络通信 -- WebRTC】项目实战记录 -- Janus 环境搭建

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月19日 01时50分02秒