C++数据类型
一.数据类型是什么
数据类型 是编程语言中最基本、最核心的概念之一。它定义了以下两个关键方面:
1. 数据的含义和解释方式
数据类型告诉编译器如何解释存储在特定内存位置的原始二进制位(0和1)。
- 例如,同样的二进制序列
01000001:- 如果类型是
char,它被解释为字符 ‘A’。 - 如果类型是
int,它可能被解释为整数 65。
- 如果类型是
2. 内存占用和行为
数据类型决定了编译器为存储该类型数据需要分配的内存大小,以及允许对该数据执行的操作(运算)。
- 例如,
int类型通常占用 4 个字节,并允许执行加、减、乘、除等算术运算。 bool类型通常只占用 1 个字节(或更少),只允许逻辑运算(AND, OR, NOT)。
二.数据类型分类
1.基础类型
这些是语言本身直接支持的类型,用于存储最基本的数据。
| 类型分类 | 关键词 | 描述 | 典型内存大小 (字节) |
|---|---|---|---|
| 整型 | int, short, long, long long |
存储整数(不带小数部分的数字)。可使用 signed 或 unsigned 修饰。 |
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. 不限定作用域的问题(缺陷)
传统枚举的主要问题是其不限定作用域:枚举常量名会直接暴露在定义它的作用域中。
- 命名冲突: 不同的枚举类型中不能使用相同的常量名。
enum Color { RED, GREEN };
// enum TrafficLight { RED, YELLOW }; // 错误!RED 重复定义 - 隐式转换: 传统枚举类型可以隐式转换为其底层整型(通常是
int)。这会损失类型安全性。Color c = RED;
int i = c; // 允许,i 的值为 0
// Color c2 = 10; // C++ 不允许将 int 直接赋给 enum 类型,但可以通过强制转换