一.数据类型是什么

数据类型 是编程语言中最基本、最核心的概念之一。它定义了以下两个关键方面:

1. 数据的含义和解释方式

数据类型告诉编译器如何解释存储在特定内存位置的原始二进制位(0和1)。

  • 例如,同样的二进制序列 01000001
    • 如果类型是 char,它被解释为字符 ‘A’
    • 如果类型是 int,它可能被解释为整数 65

2. 内存占用和行为

数据类型决定了编译器为存储该类型数据需要分配的内存大小,以及允许对该数据执行的操作(运算)

  • 例如,int 类型通常占用 4 个字节,并允许执行加、减、乘、除等算术运算。
  • bool 类型通常只占用 1 个字节(或更少),只允许逻辑运算(AND, OR, NOT)。

二.数据类型分类

1.基础类型

这些是语言本身直接支持的类型,用于存储最基本的数据。

类型分类 关键词 描述 典型内存大小 (字节)
整型 int, short, long, long long 存储整数(不带小数部分的数字)。可使用 signedunsigned 修饰。 2, 4, 8
浮点型 float, double, long double 存储带小数部分的数字(实数),用于科学计算和需要精度的场景。 4, 8, 10/16
字符型 char, wchar_t 存储单个字符(如字母 ‘A’、数字 ‘5’)。char 也可用于存储小范围整数。 1
布尔型 bool 存储逻辑值,只有两个状态:true(真)或 false(假)。 1
空值 void 表示“无类型”或“空”,常用于函数没有返回值或通用指针(void*)。 -

2.非基本数据类型

数据类型 描述 示例
数组 相同类型元素的集合 int arr[5] = {1, 2, 3, 4, 5};
指针 存储变量内存地址的类型 int* ptr = &x;
引用 变量的别名 int& ref = x;
函数 函数类型,表示函数的签名 int func(int a, int b);
结构体 用户定义的数据类型,可以包含多个不同类型的成员 struct Point { int x; int y; };
用户定义的数据类型,支持封装、继承和多态 class MyClass { ... };
联合体 多个成员共享同一块内存 union Data { int i; float f; };
枚举 用户定义的整数常量集合 enum Color { RED, GREEN, BLUE };

三.类型别名

别名 描述 示例
typedef 为现有类型定义别名 typedef int MyInt;
using 为现有类型定义别名(C++11 引入) using MyInt = int;

typedef 声明
您可以使用 typedef 为一个已有的类型取一个新的名字。下面是使用 typedef 定义一个新类型的语法:

typedef type newname; 

例如,下面的语句会告诉编译器,feet 是 int 的另一个名称:

typedef int feet;

现在,下面的声明是完全合法的,它创建了一个整型变量 distance:

feet distance;

四.枚举类型

A. 定义和基本用法

传统枚举通过 enum 关键字定义。

// 定义一个名为 Color 的枚举类型
enum Color {
RED, // 默认值 0
GREEN, // 默认值 1
BLUE // 默认值 2
};

int main() {
Color my_color = GREEN; // 使用枚举常量赋值

// 比较
if (my_color == RED) {
// ...
}
}

B. 默认值与自定义值

如果没有显式赋值,枚举常量的值从 0 开始,后续常量依次递增 1。
你也可以显式指定值,后续未指定值的常量会从上一个值继续递增。

enum Status {
START = 1, // 值为 1
PAUSE = 5, // 值为 5
STOP // 值为 6 (从 5 递增 1)
};

C. 不限定作用域的问题(缺陷)

传统枚举的主要问题是其不限定作用域:枚举常量名会直接暴露在定义它的作用域中。

  1. 命名冲突: 不同的枚举类型中不能使用相同的常量名。
    enum Color { RED, GREEN };
    // enum TrafficLight { RED, YELLOW }; // 错误!RED 重复定义
  2. 隐式转换: 传统枚举类型可以隐式转换为其底层整型(通常是 int)。这会损失类型安全性。
    Color c = RED;
    int i = c; // 允许,i 的值为 0
    // Color c2 = 10; // C++ 不允许将 int 直接赋给 enum 类型,但可以通过强制转换