0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++中位域以及union联合详解

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2021-09-24 11:31 次阅读

位域

Bit mode:2;//mode 占 2 位

类可以将其(非静态)数据成员定义为位域(bit-field),在一个位域中含有一定数量的二进制位。当一个程序需要向其他程序或硬件设备传递二进制数据时,通常会用到位域。

位域在内存中的布局是与机器有关的

位域的类型必须是整型或枚举类型,带符号类型中的位域的行为将因具体实现而定

取地址运算符(&)不能作用于位域,任何指针都无法指向类的位域

extern “C”

(1)被 extern 限定的函数或变量是 extern 类型的

(2)被 extern “C” 修饰的变量和函数是按照 C 语言方式编译和链接的

extern “C” 的作用是让 C++ 编译器将 extern “C” 声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。

extern “C” 使用

#ifdef __cplusplusextern “C” {#endif

void *memset(void *, int, size_t);

#ifdef __cplusplus}#endif

struct 和 typedef struct

C 中

// ctypedef struct Student { int age; } S;

等价于

// cstruct Student { int age; };

typedef struct Student S;

此时 S 等价于 struct Student,但两个标识符名称空间不相同。

另外还可以定义与 struct Student 不冲突的 void Student() {}。

C++ 中

由于编译器定位符号的规则(搜索规则)改变,导致不同于C语言。

一、如果在类标识符空间定义了 struct Student {。..};,使用 Student me; 时,编译器将搜索全局标识符表,Student 未找到,则在类标识符内搜索。

即表现为可以使用 Student 也可以使用 struct Student,如下:

// cppstruct Student { int age; };

void f( Student me ); // 正确,“struct” 关键字可省略

二、若定义了与 Student 同名函数之后,则 Student 只代表函数,不代表结构体,如下:

typedef struct Student { int age; } S;

void Student() {} // 正确,定义后 “Student” 只代表此函数

//void S() {} // 错误,符号 “S” 已经被定义为一个 “struct Student” 的别名

int main() { Student(); struct Student me; // 或者 “S me”; return 0;}

C++ 中 struct 和 class

总的来说,struct 更适合看成是一个数据结构的实现体,class 更适合看成是一个对象的实现体。

区别

最本质的一个区别就是默认的访问控制

(1)默认的继承访问权限。struct 是 public 的,class 是 private 的。

(2)struct 作为数据结构的实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认的成员变量访问控制是 private 的。

union 联合

联合(union)是一种节省空间的特殊的类,一个 union 可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当某个成员被赋值后其他成员变为未定义状态。联合有如下特点:

默认访问控制符为 public

可以含有构造函数、析构函数

不能含有引用类型的成员

不能继承自其他类,不能作为基类

不能含有虚函数

匿名 union 在定义所在作用域可直接访问 union 成员

匿名 union 不能包含 protected 成员或 private 成员

全局匿名联合必须是静态(static)的

union 使用

#include《iostream》

union UnionTest { UnionTest() : i(10) {}; int i; double d;};

static union { int i; double d;};

int main() { UnionTest u;

union { int i; double d; };

std::cout 《《 u.i 《《 std::endl; // 输出 UnionTest 联合的 10

::i = 20; std::cout 《《 ::i 《《 std::endl; // 输出全局静态匿名联合的 20

i = 30; std::cout 《《 i 《《 std::endl; // 输出局部匿名联合的 30

return 0;}

C 实现 C++ 类

C 实现 C++ 的面向对象特性(封装、继承、多态)

(1)封装:使用函数指针把属性与方法封装到结构体中

(2)继承:结构体嵌套

(3)多态:父类与子类方法的函数指针不同

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3439

    浏览量

    92368
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72892

原文标题:C++基础语法梳理:位域以及 union 联合!小知识分享

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    鸿蒙TypeScript学习第14天:【联合类型】

    联合类型(Union Types)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值。
    的头像 发表于 04-12 15:28 182次阅读
    鸿蒙TypeScript学习第14天:【<b class='flag-5'>联合</b>类型】

    如何使用SystemC做RTL和C/C++联合仿真呢?

    当FPGA开发者需要做RTL和C/C++联合仿真的时候,一些常用的方法包括使用MicroBlaze软核,或者使用QEMU仿真ZYNQ的PS部分。
    的头像 发表于 12-13 10:13 410次阅读
    如何使用SystemC做RTL和C/<b class='flag-5'>C++</b>的<b class='flag-5'>联合</b>仿真呢?

    介绍一种通过SystemC做RTL/C/C++联合仿真的方法

    当FPGA开发者需要做RTL和C/C++联合仿真的时候,一些常用的方法包括使用MicroBlaze软核,或者使用QEMU仿真ZYNQ的PS部分。
    的头像 发表于 12-13 10:11 368次阅读
    介绍一种通过SystemC做RTL/C/<b class='flag-5'>C++</b><b class='flag-5'>联合</b>仿真的方法

    unionunion all有什么区别

    UnionUnion All是SQL中的两个关键字,它们用于将两个或多个SELECT语句的结果集合并在一起。这两个关键字虽然有相似的功能,但在实际使用中有一些重要的区别。下面将详细介绍Union
    的头像 发表于 12-06 10:22 392次阅读

    结构体struct和联合union的区别?

    结构体struct和联合union的区别?
    发表于 10-11 08:21

    SystemVerilog中的联合(union)介绍

    在 SystemVerilog 中,联合只是信号,可通过不同名称和纵横比来加以引用。
    的头像 发表于 10-08 15:45 643次阅读
    SystemVerilog中的<b class='flag-5'>联合</b>(<b class='flag-5'>union</b>)介绍

    嵌入式C/C++语言精华文章集锦

    /C++编程,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。 经验不足的开发人员往往将所有需要传送的内容依顺序保存在 char 型数组,通过
    发表于 09-25 08:00

    如何为原生C++开发设置Android Studio

    。 为了进一步提高性能,您需要程序集使用程序集代码。 但是,使用ARM Neon内部函数可以避免编写汇编函数的复杂性。 相反,您只需要用C/C++编程并调用arm_neon.h头文件声明的内部函数或
    发表于 08-17 08:28

    C++演示的推理速度比Python演示的推理速度更快是为什么?

    在同一主机机上采用相同型号的 Ran Object Detection C++ 演示 和 对象检测 Python 演示 。 C++ 演示的推理速度比 Python 演示的推理速度
    发表于 08-15 06:52

    如何为Arm编译Cc++代码

    编译器的最新、最高效的Arm C/C++编译工具链。Arm编译器6最大限度地发挥了Arm Cortex和Neoverse处理器和架构的潜力,从Armv6-M到Armv8-A 64Arm
    发表于 08-02 17:28

    一起探索C++的世界!

    C++
    YS YYDS
    发布于 :2023年07月07日 19:10:25

    嵌入式-C++函数的重载

    一、什么是函数的重载 两个以上的函数,具有相同的函数名,通过参数的类型和参数的个数不同。编译器自行匹配,自动确定调用哪一个函数 二、函数重载的作用 C++允许功能相近的函数在相同的作用内以相同
    发表于 06-28 13:54

    C语言联合体的巧妙运用

    联合体(Union)是C语言中的一种复合类型,它允许在同一内存区域存储多个不同的数据类型的成员(member),但只能同时存在其中一个成员。
    发表于 06-21 10:59 1151次阅读

    详解C/C++结构体、联合体和枚举的区别与内存对齐

    C语言中构造类型一共有4种,它们分别是数组、结构体(struct)、共用体(union)、枚举类型(enum)。
    的头像 发表于 06-08 14:38 1676次阅读
    <b class='flag-5'>详解</b>C/<b class='flag-5'>C++</b>结构体、<b class='flag-5'>联合</b>体和枚举的区别与内存对齐

    如何使用union处理浮点数据?

    联合体(union)与结构体(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在联合体中,各成员共享一段内存空间
    的头像 发表于 05-15 09:47 697次阅读
    如何使用<b class='flag-5'>union</b>处理浮点数据?