C++內(nèi)置類(lèi)型與自定義類(lèi)型的對(duì)比分析
前言:類(lèi)型系統(tǒng)是編程語(yǔ)言的基礎(chǔ),它定義了數(shù)據(jù)的表示方式、取值范圍和可執(zhí)行的操作。C 語(yǔ)言和 C++ 作為一脈相承又各有特色的語(yǔ)言,在類(lèi)型系統(tǒng)設(shè)計(jì)上既有延續(xù)性,又存在顯著差異。
本篇文章將深入探討兩種語(yǔ)言的內(nèi)置類(lèi)型和自定義類(lèi)型,分析它們的特點(diǎn)與應(yīng)用場(chǎng)景。
一.內(nèi)置類(lèi)型
內(nèi)置類(lèi)型(Primitive Types)是編程語(yǔ)言本身提供的基本數(shù)據(jù)類(lèi)型,它們直接映射到計(jì)算機(jī)硬件能夠高效處理的數(shù)據(jù)形式。
C 語(yǔ)言的內(nèi)置類(lèi)型
C 語(yǔ)言的內(nèi)置類(lèi)型簡(jiǎn)潔而貼近硬件,主要包括:
整數(shù)類(lèi)型:
char:字符類(lèi)型,通常 1 字節(jié),可表示 ASCII 字符或小整數(shù)short/short int:短整數(shù),通常 2 字節(jié)int:整數(shù),通常 4 字節(jié),為系統(tǒng)最高效處理的整數(shù)類(lèi)型long/long int:長(zhǎng)整數(shù),通常 4 或 8 字節(jié)long long:雙長(zhǎng)整數(shù),通常 8 字節(jié)- 以上類(lèi)型均可加
signed(有符號(hào))或unsigned(無(wú)符號(hào))修飾
浮點(diǎn)類(lèi)型:
float:?jiǎn)尉雀↑c(diǎn)數(shù),通常 4 字節(jié)double:雙精度浮點(diǎn)數(shù),通常 8 字節(jié)long double:擴(kuò)展精度浮點(diǎn)數(shù),長(zhǎng)度因平臺(tái)而異
特殊類(lèi)型:
void:表示 "無(wú)類(lèi)型",用于函數(shù)返回值或通用指針
示例:
#include <stdio.h>
int main() {
char c = 'A'; // 字符類(lèi)型
unsigned int age = 30; // 無(wú)符號(hào)整數(shù)
float pi = 3.14f; // 單精度浮點(diǎn)數(shù)
double e = 2.71828; // 雙精度浮點(diǎn)數(shù)
void* ptr = NULL; // 通用指針
printf("char大小: %zu字節(jié)\n", sizeof(c));
printf("int大小: %zu字節(jié)\n", sizeof(age));
return 0;
}C++ 的內(nèi)置類(lèi)型
C++ 完全繼承了 C 的內(nèi)置類(lèi)型,并在此基礎(chǔ)上增加了一些擴(kuò)展:
- 布爾類(lèi)型:
bool,取值為true或false,這是 C 語(yǔ)言沒(méi)有的原生類(lèi)型 - 寬字符類(lèi)型:
wchar_t(寬字符)、char16_t(UTF-16 字符)、char32_t(UTF-32 字符) - C++11 后的固定大小整數(shù)類(lèi)型:如
int32_t、uint64_t等(需包含<cstdint>)
示例:
#include <iostream>
#include <cstdint>
int main() {
bool flag = true; // 布爾類(lèi)型
int32_t exact_int = 123456; // 固定32位有符號(hào)整數(shù)
uint64_t big_uint = 1234567890ULL; // 固定64位無(wú)符號(hào)整數(shù)
std::cout << "bool大小: " << sizeof(flag) << "字節(jié)\n";
std::cout << "int32_t大小: " << sizeof(exact_int) << "字節(jié)\n";
return 0;
}C++ 的內(nèi)置類(lèi)型在 C 的基礎(chǔ)上增強(qiáng)了類(lèi)型安全性和對(duì)現(xiàn)代字符編碼的支持,bool類(lèi)型的引入使邏輯判斷更加清晰。
二.自定義類(lèi)型:開(kāi)發(fā)者構(gòu)建的數(shù)據(jù)結(jié)構(gòu)
自定義類(lèi)型(User-Defined Types)允許開(kāi)發(fā)者根據(jù)需求創(chuàng)建新的數(shù)據(jù)類(lèi)型,是構(gòu)建復(fù)雜程序的基礎(chǔ)。
C 語(yǔ)言的自定義類(lèi)型
C 語(yǔ)言提供了有限但實(shí)用的自定義類(lèi)型機(jī)制:
- 結(jié)構(gòu)體(struct):將不同類(lèi)型的變量組合在一起
// 定義點(diǎn)結(jié)構(gòu)體
struct Point {
int x;
int y;
};
// 定義學(xué)生結(jié)構(gòu)體
struct Student {
char name[20];
int age;
float score;
struct Point location; // 結(jié)構(gòu)體嵌套
};- 聯(lián)合體(union):所有成員共享同一塊內(nèi)存空間
// 可存儲(chǔ)不同類(lèi)型數(shù)據(jù)的聯(lián)合體
union Data {
int i;
float f;
char str[20];
}; // 大小為20字節(jié)(最大成員的大?。?/pre>- 枚舉(enum):為整數(shù)常量定義有意義的名稱(chēng)
// 定義顏色枚舉
enum Color {
RED, // 0
GREEN, // 1
BLUE // 2
};
// 定義帶初始值的枚舉
enum Month {
JAN = 1,
FEB,
MAR,
// ... 其余月份
DEC
};- typedef :為現(xiàn)有類(lèi)型創(chuàng)建別名
typedef struct {
int hours;
int minutes;
int seconds;
} Time; // 現(xiàn)在可以用Time代替struct定義
typedef unsigned long long ULL; // 為無(wú)符號(hào)長(zhǎng)long創(chuàng)建短別名C 語(yǔ)言的自定義類(lèi)型本質(zhì)上是數(shù)據(jù)的聚合,缺乏對(duì)數(shù)據(jù)操作的封裝。
C++ 的自定義類(lèi)型
C++ 在 C 的基礎(chǔ)上極大地?cái)U(kuò)展了自定義類(lèi)型的能力,引入了面向?qū)ο蟮奶匦裕?/p>
- 類(lèi)(class):C++ 的核心,將數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)封裝在一起
class Circle {
private:
// 私有成員(數(shù)據(jù)隱藏)
double radius;
const double PI = 3.14159;
public:
// 構(gòu)造函數(shù)(初始化對(duì)象)
Circle(double r) : radius(r) {}
// 成員函數(shù)(操作數(shù)據(jù))
double getArea() const {
return PI * radius * radius;
}
void setRadius(double r) {
if (r > 0) radius = r; // 可以加入數(shù)據(jù)驗(yàn)證
}
};- 結(jié)構(gòu)體(struct):在 C++ 中與 class 類(lèi)似,區(qū)別在于默認(rèn)訪(fǎng)問(wèn)權(quán)限為 public
struct Rectangle {
double width;
double height;
// C++結(jié)構(gòu)體可以有成員函數(shù)
double area() const {
return width * height;
}
};- 聯(lián)合體(union):C++11 后支持包含非 POD 類(lèi)型和成員函數(shù)
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; }
};- 枚舉類(lèi)(enum class):類(lèi)型安全的枚舉,避免命名沖突
enum class Color {
RED,
GREEN,
BLUE
};
enum class TrafficLight {
RED, // 與Color::RED不沖突
YELLOW,
GREEN
};- 其他自定義類(lèi)型 :
- 模板類(lèi)型 :如std::vector、std::string等標(biāo)準(zhǔn)容器
- 類(lèi)型別名 **:using關(guān)鍵字(比 typedef 更靈活)
using IntPair = std::pair<int, int>; using StringList = std::vector<std::string>;
C++ 的自定義類(lèi)型實(shí)現(xiàn)了數(shù)據(jù)與操作的封裝,支持訪(fǎng)問(wèn)控制、繼承、多態(tài)等面向?qū)ο筇匦?,極大地增強(qiáng)了代碼的模塊化和可維護(hù)性。
三.類(lèi)型系統(tǒng)的核心差異對(duì)比
| 特性 | C 語(yǔ)言 | C++ |
|---|---|---|
| 內(nèi)置類(lèi)型 | 基礎(chǔ)整數(shù)、浮點(diǎn)、字符類(lèi)型,無(wú)布爾類(lèi)型 | 繼承 C 的所有類(lèi)型,增加 bool、寬字符類(lèi)型和固定大小整數(shù)類(lèi)型 |
| 自定義類(lèi)型基礎(chǔ) | struct、union、enum、typedef | 繼承 C 的所有形式并增強(qiáng) |
| 面向?qū)ο笾С?/td> | 無(wú) | 有(class 為核心) |
| 封裝性 | 僅數(shù)據(jù)聚合,無(wú)訪(fǎng)問(wèn)控制 | 支持?jǐn)?shù)據(jù)和函數(shù)封裝,有 public/private/protected 控制 |
| 類(lèi)型安全 | 較弱,隱式轉(zhuǎn)換較多 | 較強(qiáng),引入 enum class 等安全類(lèi)型 |
| 擴(kuò)展性 | 有限 | 強(qiáng)大,支持模板、繼承、多態(tài)等 |
實(shí)踐建議
1. C 語(yǔ)言 :
- 利用 struct 組織相關(guān)數(shù)據(jù)
- 使用 enum 使代碼更具可讀性
- 合理使用 typedef 簡(jiǎn)化復(fù)雜類(lèi)型聲明
- 注意 union 的內(nèi)存共享特性,避免數(shù)據(jù)訪(fǎng)問(wèn)沖突
2.C++ 語(yǔ)言 :
- 優(yōu)先使用 class 封裝數(shù)據(jù)和操作
- 用 enum class 替代傳統(tǒng) enum,提高類(lèi)型安全性
- 利用 using 創(chuàng)建清晰的類(lèi)型別名
- 充分利用標(biāo)準(zhǔn)庫(kù)提供的豐富自定義類(lèi)型(如
std::string、std::vector) - 對(duì)于簡(jiǎn)單數(shù)據(jù)聚合可使用 struct,需要封裝和行為時(shí)使用 class
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++ 中CListCtrl的每個(gè)項(xiàng)都顯示不同的提示信息
這篇文章主要介紹了C++ 中CListCtrl的每個(gè)項(xiàng)都顯示不同的提示信息的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09
VScode編譯C++ 頭文件顯示not found的問(wèn)題
這篇文章主要介紹了VScode編譯C++ 頭文件顯示not found的問(wèn)題,本文給大家分享問(wèn)題解決方法,通過(guò)截圖的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-03-03
C語(yǔ)言 函數(shù)指針(指向函數(shù)的指針)詳解
本文主要介紹 C語(yǔ)言函數(shù)指針的知識(shí),這里整理了詳細(xì)的資料及示例代碼以便大家學(xué)習(xí)參考,有需要學(xué)習(xí)此部分知識(shí)的朋友可以參考下2016-08-08
C++ 二維數(shù)組參數(shù)傳遞的實(shí)現(xiàn)方法
這篇文章主要介紹了C++ 二維數(shù)組參數(shù)傳遞的實(shí)現(xiàn)方法的相關(guān)資料,這里提供三種方法幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08

