C++内置类型与自定义类型的对比分析

 更新时间:2025年08月27日 08:55:06   作者:草莓熊Lotso  
本文对比了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:表示 "无类型",用于函数返回值或通用指针

示例:

#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 的内置类型,并在此基础上增加了一些扩展:

  1. 布尔类型bool,取值为truefalse,这是 C 语言没有的原生类型
  2. 宽字符类型wchar_t(宽字符)、char16_t(UTF-16 字符)、char32_t(UTF-32 字符)
  3. C++11 后的固定大小整数类型:如int32_tuint64_t等(需包含<cstdint>

示例:

#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):将不同类型的变量组合在一起
// 定义点结构体
struct Point {
    int x;
    int y;
};

// 定义学生结构体
struct Student {
    char name[20];
    int age;
    float score;
    struct Point location; // 结构体嵌套
};
  • 联合体(union):所有成员共享同一块内存空间
// 可存储不同类型数据的联合体
union Data {
    int i;
    float f;
    char str[20];
}; // 大小为20字节(最大成员的大小)
  • 枚举(enum):为整数常量定义有意义的名称
// 定义颜色枚举
enum Color {
    RED,    // 0
    GREEN,  // 1
    BLUE    // 2
};

// 定义带初始值的枚举
enum Month {
    JAN = 1,
    FEB,
    MAR,
    // ... 其余月份
    DEC
};
  •  typedef :为现有类型创建别名
typedef struct {
    int hours;
    int minutes;
    int seconds;
} Time; // 现在可以用Time代替struct定义

typedef unsigned long long ULL; // 为无符号长long创建短别名

C 语言的自定义类型本质上是数据的聚合,缺乏对数据操作的封装。

C++ 的自定义类型

C++ 在 C 的基础上极大地扩展了自定义类型的能力,引入了面向对象的特性:

  • 类(class):C++ 的核心,将数据和操作数据的函数封装在一起
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
struct Rectangle {
    double width;
    double height;
    
    // C++结构体可以有成员函数
    double area() const {
        return width * height;
    }
};
  •  联合体(union):C++11 后支持包含非 POD 类型和成员函数
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):类型安全的枚举,避免命名冲突
enum class Color {
    RED,
    GREEN,
    BLUE
};

enum class TrafficLight {
    RED,    // 与Color::RED不冲突
    YELLOW,
    GREEN
};
  • 其他自定义类型 

- 模板类型 :如std::vectorstd::string等标准容器

- 类型别名 **:using关键字(比 typedef 更灵活)

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 等安全类型
扩展性有限强大,支持模板、继承、多态等

实践建议

1. C 语言 :

  • 利用 struct 组织相关数据
  • 使用 enum 使代码更具可读性
  • 合理使用 typedef 简化复杂类型声明
  • 注意 union 的内存共享特性,避免数据访问冲突

2.C++ 语言 :

  • 优先使用 class 封装数据和操作
  • 用 enum class 替代传统 enum,提高类型安全性
  • 利用 using 创建清晰的类型别名
  • 充分利用标准库提供的丰富自定义类型(如std::stringstd::vector
  • 对于简单数据聚合可使用 struct,需要封装和行为时使用 class

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++中char*转换为LPCWSTR的解决方案

    C++中char*转换为LPCWSTR的解决方案

    最近在学习C++,遇到了一个char*转换为LPCWSTR的问题,通过查找资料终于解决了,所以下面这篇文章主要介绍了C++中char*转LPCWSTR的解决方案,文中通过详细的示例代码介绍的很详细,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • C++实用库之字节流合成器

    C++实用库之字节流合成器

    在处理跨平台的数据交换或网络通信时,字节流的重要性更加突出,不同的系统可能有不同的字节序(大端序或小端序),因此在发送和接收字节流时,可能需要考虑字节序的转换,这篇文章主要介绍了C++实用库之字节流合成器,需要的朋友可以参考下
    2024-04-04
  • 浅谈C++ 缓冲区(buffer)的使用

    浅谈C++ 缓冲区(buffer)的使用

    缓冲区是用来存放流中的数据,本文详细的介绍了C++ 缓冲区(buffer)的使用,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C++中使用mutable关键字的场景分析

    C++中使用mutable关键字的场景分析

    C++中的mutable关键字用于修饰类的成员变量,使其在const成员函数中可以被修改,它主要用于缓存、线程同步和调试等场景,以支持对象的逻辑常量性,在使用mutable时,应确保其修改不会破坏对象的外部表现状态,本文介绍C++中使用mutable关键字的场景分析,感兴趣的朋友一起看看吧
    2025-02-02
  • c/c++的opencv椒盐噪声的实现

    c/c++的opencv椒盐噪声的实现

    椒盐噪声是一种简单的图像噪声模型,通过在C/C++中利用随机数生成器,我们可以有效地模拟这种噪声,本文就来介绍一下如何实现,感兴趣的可以了解一下
    2025-05-05
  • 一文读懂C++中Protobuf

    一文读懂C++中Protobuf

    Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化、或者说序列化,本文详解了Protobuf的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-05-05
  • C语言 基本语法示例讲解

    C语言 基本语法示例讲解

    本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下
    2016-08-08
  • C++实现动态线性表

    C++实现动态线性表

    这篇文章主要为大家详细介绍了C++实现动态线性表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C语言深入浅出分析函数指针

    C语言深入浅出分析函数指针

    函数指针是一个指针变量,它可以存储函数的地址,然后使用函数指针,下面这篇文章主要给大家介绍了关于C语言进阶教程之函数指针的相关资料,需要的朋友可以参考下
    2022-07-07
  • C语言超详细讲解排序算法下篇

    C语言超详细讲解排序算法下篇

    今天我们主要难点有快速排序和归并排序,会简单涉及到二叉树相关知识,相对来说比较抽象!所以如果有看不懂或者不明白的地方可以看看我之前的详解二叉树
    2022-04-04

最新评论