C++学习笔记(三十八):c++ 联合体

本节介绍c++联合体union。一个联合体只能有一个成员,例如我们声明4个float变量,但联合体的大小仍为4字节,这4个float的内存是一样的。可以像结构体一样使用联合体,可以添加静态函数或者普通函数方法等。但不能使用虚函数。一般使用联合体和类型双关相关联。类型双关是指将同一块内存的数据类型转换成其他数据类型。例如将int a = 4;float b = (float),此处仅仅举例。当想给同一个变量取不同的名字是,联合体的作用就体现出来了。例如一个结构体Vector3(x,y,y),既想当作向量,又想当作三原色RGB。代码示例如下:

cpp 复制代码
#include<iostream>
struct Vector2
{
    float x,y;
};
struct Vector4
{
    float x,y,z,w;
};

void PrintVector2(const Vector2& vector)
{
    std::cout << vector.x << ", " << vector.y << std::endl;
}

int main(){
    struct TestUnion
    {
        //创建一个匿名联合体,既可以表示float又可以表示int。
        union
        {
            float a;
            int b;
        };
    };
    TestUnion u;
    u.a = 2.0f;
    std::cout<< u.a << ", " << u.b << std::endl;

    std::cin.get();
}

2, 1073741824

  • 输出的2是float型2,1073741824是float型2的二进制表示。
cpp 复制代码
#include<iostream>
struct Vector2
{
    float x,y;
};
struct Vector4
{
    //可以看做是两个Vector2
    union 
    {
        //两种访问Vector4的方式
        struct 
        {
            float x,y,z,w;
        };
        struct 
        {
            Vector2 a,b;//a对应x,y,b对应z,w
        };
        
    };
};

void PrintVector2(const Vector2& vector)
{
    std::cout << vector.x << ", " << vector.y << std::endl;
}

int main(){
    Vector4 vector = {1.0f,2.0f,3.0f,4.0f};
    PrintVector2(vector.a);
    PrintVector2(vector.b);
    vector.z = 800.0f;
    PrintVector2(vector.a);
    PrintVector2(vector.b);
    std::cin.get();
}

1, 2

3, 4

1, 2

800, 4

  • 上述示例展示如何不新增PrintVector4函数,仅通过联合体通过PrintVector2来打印Vector4。
相关推荐
松涛和鸣19 小时前
11.C 语言学习:递归、宏定义、预处理、汉诺塔、Fibonacci 等
linux·c语言·开发语言·学习·算法·排序算法
心无旁骛~20 小时前
Masquerade 总结笔记:解锁野外人类视频的机器人政策学习潜力
笔记·机器人
谅望者1 天前
数据分析笔记14:Python文件操作
大数据·数据库·笔记·python·数据挖掘·数据分析
未若君雅裁1 天前
LeetCode 51 - N皇后问题 详解笔记
java·数据结构·笔记·算法·leetcode·剪枝
Q***f6351 天前
后端消息队列学习资源,RabbitMQ+Kafka
学习·kafka·rabbitmq
循环过三天1 天前
7.7、Python-常用内置函数
笔记·python·学习
烤麻辣烫1 天前
23种设计模式(新手)-5里氏替换原则
java·学习·设计模式·intellij-idea·里氏替换原则
AA陈超1 天前
ASC学习笔记0007:用于与GameplayAbilities系统交互的核心ActorComponent
c++·笔记·学习·ue5·虚幻引擎
智者知已应修善业1 天前
【51单片机:两边向中间流水:即两边先点亮然后熄灭,次边的点亮再熄灭,直到最中间的两个点亮再熄灭,然后重复动作。】2023-3-4
c语言·c++·经验分享·笔记·嵌入式硬件·算法·51单片机