

🔥个人主页:@草莓熊Lotso
🎬作者简介:C++研发方向学习者
📖个人专栏:************************************************************************************************************************************************************************************************************************************************************《C语言》《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》****************************************************************************************************************************************************************************************************************************************************************
⭐️人生格言:生活是默默的坚持,毅力是永久的享受。
前言:类型系统是编程语言的基础,它定义了数据的表示方式、取值范围和可执行的操作。C 语言和 C++ 作为一脉相承又各有特色的语言,在类型系统设计上既有延续性,又存在显著差异。本篇博客将深入探讨两种语言的内置类型和自定义类型,分析它们的特点与应用场景。
目录
[C 语言的内置类型](#C 语言的内置类型)
[C++ 的内置类型](#C++ 的内置类型)
[C 语言的自定义类型](#C 语言的自定义类型)
[C++ 的自定义类型](#C++ 的自定义类型)
一.内置类型
内置类型(Primitive Types)是编程语言本身提供的基本数据类型,它们直接映射到计算机硬件能够高效处理的数据形式。
C 语言的内置类型
C 语言的内置类型简洁而贴近硬件,主要包括:
-
整数类型:
char
:字符类型,通常 1 字节,可表示 ASCII 字符或小整数short
/short int
:短整数,通常 2 字节int
:整数,通常 4 字节,为系统最高效处理的整数类型long
/long int
:长整数,通常 4 或 8 字节long long
:双长整数,通常 8 字节- 以上类型均可加
signed
(有符号)或unsigned
(无符号)修饰
-
浮点类型:
float
:单精度浮点数,通常 4 字节double
:双精度浮点数,通常 8 字节long double
:扩展精度浮点数,长度因平台而异
-
特殊类型:
void
:表示 "无类型",用于函数返回值或通用指针
示例:
cpp
#include <stdio.h>
int main() {
char c = 'A'; // 字符类型
unsigned int age = 30; // 无符号整数
float pi = 3.14f; // 单精度浮点数
double e = 2.71828; // 双精度浮点数
void* ptr = NULL; // 通用指针
printf("char大小: %zu字节\n", sizeof(c));
printf("int大小: %zu字节\n", sizeof(age));
return 0;
}
C++ 的内置类型
C++ 完全继承了 C 的内置类型,并在此基础上增加了一些扩展:
- 布尔类型 :
bool
,取值为true
或false
,这是 C 语言没有的原生类型 - 宽字符类型 :
wchar_t
(宽字符)、char16_t
(UTF-16 字符)、char32_t
(UTF-32 字符) - C++11 后的固定大小整数类型 :如
int32_t
、uint64_t
等(需包含<cstdint>
)
示例:
cpp
#include <iostream>
#include <cstdint>
int main() {
bool flag = true; // 布尔类型
int32_t exact_int = 123456; // 固定32位有符号整数
uint64_t big_uint = 1234567890ULL; // 固定64位无符号整数
std::cout << "bool大小: " << sizeof(flag) << "字节\n";
std::cout << "int32_t大小: " << sizeof(exact_int) << "字节\n";
return 0;
}
C++ 的内置类型在 C 的基础上增强了类型安全性和对现代字符编码的支持,bool
类型的引入使逻辑判断更加清晰。
二.自定义类型:开发者构建的数据结构
自定义类型(User-Defined Types)允许开发者根据需求创建新的数据类型,是构建复杂程序的基础。
C 语言的自定义类型
C 语言提供了有限但实用的自定义类型机制:
- 结构体(struct):将不同类型的变量组合在一起
cpp
// 定义点结构体
struct Point {
int x;
int y;
};
// 定义学生结构体
struct Student {
char name[20];
int age;
float score;
struct Point location; // 结构体嵌套
};
- 联合体(union):所有成员共享同一块内存空间
cpp
// 可存储不同类型数据的联合体
union Data {
int i;
float f;
char str[20];
}; // 大小为20字节(最大成员的大小)
- 枚举(enum):为整数常量定义有意义的名称
cpp
// 定义颜色枚举
enum Color {
RED, // 0
GREEN, // 1
BLUE // 2
};
// 定义带初始值的枚举
enum Month {
JAN = 1,
FEB,
MAR,
// ... 其余月份
DEC
};
- typedef :为现有类型创建别名
cpp
typedef struct {
int hours;
int minutes;
int seconds;
} Time; // 现在可以用Time代替struct定义
typedef unsigned long long ULL; // 为无符号长long创建短别名
C 语言的自定义类型本质上是数据的聚合,缺乏对数据操作的封装。
C++ 的自定义类型
C++ 在 C 的基础上极大地扩展了自定义类型的能力,引入了面向对象的特性:
- 类(class):C++ 的核心,将数据和操作数据的函数封装在一起
cpp
class Circle {
private:
// 私有成员(数据隐藏)
double radius;
const double PI = 3.14159;
public:
// 构造函数(初始化对象)
Circle(double r) : radius(r) {}
// 成员函数(操作数据)
double getArea() const {
return PI * radius * radius;
}
void setRadius(double r) {
if (r > 0) radius = r; // 可以加入数据验证
}
};
- 结构体(struct):在 C++ 中与 class 类似,区别在于默认访问权限为 public
cpp
struct Rectangle {
double width;
double height;
// C++结构体可以有成员函数
double area() const {
return width * height;
}
};
- 联合体(union):C++11 后支持包含非 POD 类型和成员函数
cpp
union Variant {
private:
int i;
float f;
public:
Variant(int val) : i(val) {}
Variant(float val) : f(val) {}
int getInt() const { return i; }
float getFloat() const { return f; }
};
- 枚举类(enum class):类型安全的枚举,避免命名冲突
cpp
enum class Color {
RED,
GREEN,
BLUE
};
enum class TrafficLight {
RED, // 与Color::RED不冲突
YELLOW,
GREEN
};
- 其他自定义类型 :
- 模板类型 :如std::vector
、std::string
等标准容器
- 类型别名 **:using
关键字(比 typedef 更灵活)
cpp
using IntPair = std::pair<int, int>;
using StringList = std::vector<std::string>;
C++ 的自定义类型实现了数据与操作的封装,支持访问控制、继承、多态等面向对象特性,极大地增强了代码的模块化和可维护性。
三.类型系统的核心差异对比
特性 | C 语言 | C++ |
---|---|---|
内置类型 | 基础整数、浮点、字符类型,无布尔类型 | 继承 C 的所有类型,增加 bool、宽字符类型和固定大小整数类型 |
自定义类型基础 | struct、union、enum、typedef | 继承 C 的所有形式并增强 |
面向对象支持 | 无 | 有(class 为核心) |
封装性 | 仅数据聚合,无访问控制 | 支持数据和函数封装,有 public/private/protected 控制 |
类型安全 | 较弱,隐式转换较多 | 较强,引入 enum class 等安全类型 |
扩展性 | 有限 | 强大,支持模板、继承、多态等 |
实践建议
- C 语言 :
- 利用 struct 组织相关数据
- 使用 enum 使代码更具可读性
- 合理使用 typedef 简化复杂类型声明
- 注意 union 的内存共享特性,避免数据访问冲突
2.C++ 语言 :
- 优先使用 class 封装数据和操作
- 用 enum class 替代传统 enum,提高类型安全性
- 利用 using 创建清晰的类型别名
- 充分利用标准库提供的丰富自定义类型(如
std::string
、std::vector
) - 对于简单数据聚合可使用 struct,需要封装和行为时使用 class
往期回顾:
【C++】--指针与引用深入解析和对比
【C++】--函数参数传递:传值与传引用的深度解析
**结语:**C 语言的类型系统简洁高效,贴近硬件,适合系统级编程;C++ 则在 C 的基础上构建了更为丰富和安全的类型系统,特别是通过 class 实现的面向对象机制,为大型复杂程序提供了更好的抽象和封装能力。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。