主页
  • 主页
  • 分类
  • 热文
  • 教程
  • 面试
  • 标签
C++

C++ 基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

C++ 字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

C++ 函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

C++ 面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

C++ 高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

C++ 联合类型


上一章 下一章

在 C++ 中,联合(union)是一种用户定义的数据类型,它允许你在同一个内存位置存储不同的数据类型。但是,联合一次只能存储其成员变量中的一个,这意味着如果你给一个成员赋值,先前存储在另一个成员中的值就会被覆盖。联合的大小由其最大的成员决定。

联合声明

要声明一个联合,使用 union 关键字后跟标签名(联合名)然后声明联合成员及其数据类型放在花括号内。声明以分号结束。

下面是声明联合的语法:

union UnionName {
  dataType1 member1;
  dataType2 member2;
  // 更多成员
};

示例

根据上述语法声明联合的一个简短示例如下:

union UnionName {
  int intValue;     // 整型值成员
  float floatValue; // 浮点型值成员
  char charValue;   // 字符值成员
};

声明联合变量

声明联合之后,你需要声明它的变量以便访问和操作其成员。

声明联合变量的语法如下:

union_name variable;

访问联合成员

可以在声明联合变量后使用点运算符(.)来访问联合成员。

访问联合成员的语法如下:

union_variable.member

C++ 联合示例

以下是一个完整的联合示例,演示了它的使用方法:

#include <iostream>
#include <cstring>

using namespace std;

union Data {
  int intValue; // 整型值成员
  float floatValue; // 浮点型值成员
  char strValue[50]; // 字符串值成员
};

int main() {
  // 定义一个联合变量
  Data data;

  data.intValue = 2006;
  cout << "TutorialsPoint: Founded in " << data.intValue << endl;

  // 覆盖之前的整型值
  data.floatValue = 5.75f;
  cout << "My Float value is: " << data.floatValue << endl;

  // 覆盖之前的浮点型值
  strcpy(data.strValue, "Hello TutorialsPoint Learner");
  cout << data.strValue << endl;

  // 在赋值字符串后访问整型值
  cout << "Integer after string assignment: " << data.intValue << endl;
  // 不确定的行为

  return 0;
}

当上述代码被编译并执行时,它产生如下结果:

TutorialsPoint: Founded in 2006
My Float value is: 5.75
Hello TutorialsPoint Learner
Integer after string assignment: 1819043144

解释

上述示例展示了联合的使用,它是如何创建和访问的。

首先,定义了一个名为 Data 的联合,其中有三个成员:int intValue、float floatValue、char strValue[50],其中只有一个成员可以在任何给定时刻持有值。 由于联合的大小由最大成员决定,所以在这个例子中(字符数组)。 在 int main() 函数体内声明了一个联合变量 data。 为了赋值和访问成员,所有成员都通过使用 . 作为 data.intValue 分别赋值。 对于浮点值,浮点成员 floatValue 被赋予值 5.75。 然而,由于联合一次只能持有一个值,所以之前 intValue 的值被覆盖,虽然它仍然占用相同的内存空间。 最后,当代码试图在被字符串赋值后打印 intValue 时,这会导致不确定的行为,因为整型值不再有效,访问它可能会得到意外的结果,正如输出所示。

匿名联合

匿名联合是一种特殊的联合类型,没有名字。这有助于简化代码,允许你直接访问联合成员而不必指定联合变量名。

语法

匿名联合的简单语法如下,声明时不带任何名字,允许直接访问其成员:

union {
  dataType1 member1;
  dataType2 member2;
  // 额外成员...
};

示例

以下是一个基于上述语法的匿名联合示例:

#include <iostream>
#include <cstring>

using namespace std; // 使用标准命名空间

int main() {
  // 匿名联合声明
  union {
    int intValue;
    float floatValue;
    char strValue[50];
  };

  // 赋予整型值
  intValue = 2006;
  cout << "Integer Value: " << intValue << endl;

  // 赋予浮点值(覆盖之前的整型值)
  floatValue = 3.14f;
  cout << "Float Value: " << floatValue << endl;

  // 赋予字符串值(覆盖之前的浮点值)
  strcpy(strValue, "Hello, TutorialsPoint Learner!");
  cout << "String Value: " << strValue << endl;

  // 在字符串赋值后访问整型值(不确定行为)
  cout << "Integer after string assignment: " << intValue << endl;

  return 0;
}

当上述代码被编译并执行时,它产生如下结果:

Integer Value: 2006
Float Value: 3.14
String Value: Hello, TutorialsPoint Learner!
Integer after string assignment: 1819043144

类似的联合类

在 C++ 中,类似于联合的类被定义为至少包含一个匿名联合的类。定义在这些匿名联合中的数据成员被称为变体成员。它们是封装联合概念的数据结构,但提供了额外的类型安全和可用性特性。

这些通常结合使用成员变量和机制(如枚举器)来跟踪当前哪个类型是活跃的。

语法

这是类似于联合类的基本语法,在这里使用 class 关键字定义类,接着是类名 UnionLikeClass:

class UnionLikeClass {
public:
  union {
    dataType1 member1;  // 类型为 dataType1 的成员
    dataType2 member2;  // 类型为 dataType2 的成员
    // 额外成员...
  };
};

示例

以下是一个基于上述语法的类似联合的类的示例:

#include <iostream>
#include <cstring>

using namespace std;

class UnionLikeClass {
public:
  // 匿名联合声明
  union {
    int intValue; // 整型值成员
    float floatValue; // 浮点型值成员
    char strValue[50]; // 字符串值成员
  };

  // 方法来显示当前值
  void display() {
    cout << "Integer Value: " << intValue << endl;
    cout << "Float Value: " << floatValue << endl;
    cout << "String Value: " << strValue << endl;
  }
};

int main() {

  // 创建 UnionLikeClass 的实例
  UnionLikeClass data;

  data.intValue = 2006;
  cout << "TutorialsPoint: Founded in " << data.intValue << endl;

  data.floatValue = 3.14f;
  cout << "Assigned Float Value: " << data.floatValue << endl;

  // 赋予字符串值(覆盖之前的浮点值)
  strcpy(data.strValue, "Hello, Union Like Class!");
  cout << "Assigned String Value: " << data.strValue << endl;

  // 在字符串赋值后访问整型值(不确定行为)
  cout << "Integer after string assignment: " << data.intValue << endl;
  // 不确定的行为

  return 0;
}

输出结果:

TutorialsPoint: Founded in 2006
Assigned Float Value: 3.14
Assigned String Value: Hello, Union Like Class!
Integer after string assignment: 1819043144
上一章 下一章
阅读号二维码

关注阅读号

联系二维码

联系我们

© 2024 Yoagoa. All rights reserved.

粤ICP备18007391号

站点地图