C++內(nèi)置類型與自定義類型的對(duì)比分析
前言:類型系統(tǒng)是編程語(yǔ)言的基礎(chǔ),它定義了數(shù)據(jù)的表示方式、取值范圍和可執(zhí)行的操作。C 語(yǔ)言和 C++ 作為一脈相承又各有特色的語(yǔ)言,在類型系統(tǒng)設(shè)計(jì)上既有延續(xù)性,又存在顯著差異。
本篇文章將深入探討兩種語(yǔ)言的內(nèi)置類型和自定義類型,分析它們的特點(diǎn)與應(yīng)用場(chǎng)景。
一.內(nèi)置類型
內(nèi)置類型(Primitive Types)是編程語(yǔ)言本身提供的基本數(shù)據(jù)類型,它們直接映射到計(jì)算機(jī)硬件能夠高效處理的數(shù)據(jù)形式。
C 語(yǔ)言的內(nèi)置類型
C 語(yǔ)言的內(nèi)置類型簡(jiǎn)潔而貼近硬件,主要包括:
整數(shù)類型:
char:字符類型,通常 1 字節(jié),可表示 ASCII 字符或小整數(shù)short/short int:短整數(shù),通常 2 字節(jié)int:整數(shù),通常 4 字節(jié),為系統(tǒng)最高效處理的整數(shù)類型long/long int:長(zhǎng)整數(shù),通常 4 或 8 字節(jié)long long:雙長(zhǎng)整數(shù),通常 8 字節(jié)- 以上類型均可加
signed(有符號(hào))或unsigned(無(wú)符號(hào))修飾
浮點(diǎn)類型:
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)而異
特殊類型:
void:表示 "無(wú)類型",用于函數(shù)返回值或通用指針
示例:
#include <stdio.h>
int main() {
char c = 'A'; // 字符類型
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)置類型
C++ 完全繼承了 C 的內(nèi)置類型,并在此基礎(chǔ)上增加了一些擴(kuò)展:
- 布爾類型:
bool,取值為true或false,這是 C 語(yǔ)言沒有的原生類型 - 寬字符類型:
wchar_t(寬字符)、char16_t(UTF-16 字符)、char32_t(UTF-32 字符) - C++11 后的固定大小整數(shù)類型:如
int32_t、uint64_t等(需包含<cstdint>)
示例:
#include <iostream>
#include <cstdint>
int main() {
bool flag = true; // 布爾類型
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)置類型在 C 的基礎(chǔ)上增強(qiáng)了類型安全性和對(duì)現(xiàn)代字符編碼的支持,bool類型的引入使邏輯判斷更加清晰。
二.自定義類型:開發(fā)者構(gòu)建的數(shù)據(jù)結(jié)構(gòu)
自定義類型(User-Defined Types)允許開發(fā)者根據(jù)需求創(chuàng)建新的數(shù)據(jù)類型,是構(gòu)建復(fù)雜程序的基礎(chǔ)。
C 語(yǔ)言的自定義類型
C 語(yǔ)言提供了有限但實(shí)用的自定義類型機(jī)制:
- 結(jié)構(gòu)體(struct):將不同類型的變量組合在一起
// 定義點(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ǔ)不同類型數(shù)據(jù)的聯(lián)合體
union Data {
int i;
float f;
char str[20];
}; // 大小為20字節(jié)(最大成員的大?。?/pre>- 枚舉(enum):為整數(shù)常量定義有意義的名稱
// 定義顏色枚舉
enum Color {
RED, // 0
GREEN, // 1
BLUE // 2
};
// 定義帶初始值的枚舉
enum Month {
JAN = 1,
FEB,
MAR,
// ... 其余月份
DEC
};- typedef :為現(xiàn)有類型創(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ǔ)言的自定義類型本質(zhì)上是數(shù)據(jù)的聚合,缺乏對(duì)數(shù)據(jù)操作的封裝。
C++ 的自定義類型
C++ 在 C 的基礎(chǔ)上極大地?cái)U(kuò)展了自定義類型的能力,引入了面向?qū)ο蟮奶匦裕?/p>
- 類(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 類似,區(qū)別在于默認(rè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 類型和成員函數(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; }
};- 枚舉類(enum class):類型安全的枚舉,避免命名沖突
enum class Color {
RED,
GREEN,
BLUE
};
enum class TrafficLight {
RED, // 與Color::RED不沖突
YELLOW,
GREEN
};- 其他自定義類型 :
- 模板類型 :如std::vector、std::string等標(biāo)準(zhǔn)容器
- 類型別名 **:using關(guān)鍵字(比 typedef 更靈活)
using IntPair = std::pair<int, int>; using StringList = std::vector<std::string>;
C++ 的自定義類型實(shí)現(xiàn)了數(shù)據(jù)與操作的封裝,支持訪問控制、繼承、多態(tài)等面向?qū)ο筇匦?,極大地增強(qiáng)了代碼的模塊化和可維護(hù)性。
三.類型系統(tǒng)的核心差異對(duì)比
| 特性 | C 語(yǔ)言 | C++ |
|---|---|---|
| 內(nèi)置類型 | 基礎(chǔ)整數(shù)、浮點(diǎn)、字符類型,無(wú)布爾類型 | 繼承 C 的所有類型,增加 bool、寬字符類型和固定大小整數(shù)類型 |
| 自定義類型基礎(chǔ) | struct、union、enum、typedef | 繼承 C 的所有形式并增強(qiáng) |
| 面向?qū)ο笾С?/td> | 無(wú) | 有(class 為核心) |
| 封裝性 | 僅數(shù)據(jù)聚合,無(wú)訪問控制 | 支持?jǐn)?shù)據(jù)和函數(shù)封裝,有 public/private/protected 控制 |
| 類型安全 | 較弱,隱式轉(zhuǎn)換較多 | 較強(qiáng),引入 enum class 等安全類型 |
| 擴(kuò)展性 | 有限 | 強(qiáng)大,支持模板、繼承、多態(tài)等 |
實(shí)踐建議
1. C 語(yǔ)言 :
- 利用 struct 組織相關(guān)數(shù)據(jù)
- 使用 enum 使代碼更具可讀性
- 合理使用 typedef 簡(jiǎn)化復(fù)雜類型聲明
- 注意 union 的內(nèi)存共享特性,避免數(shù)據(jù)訪問沖突
2.C++ 語(yǔ)言 :
- 優(yōu)先使用 class 封裝數(shù)據(jù)和操作
- 用 enum class 替代傳統(tǒng) enum,提高類型安全性
- 利用 using 創(chuàng)建清晰的類型別名
- 充分利用標(biāo)準(zhǔn)庫(kù)提供的豐富自定義類型(如
std::string、std::vector) - 對(duì)于簡(jiǎn)單數(shù)據(jù)聚合可使用 struct,需要封裝和行為時(shí)使用 class
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++中char*轉(zhuǎn)換為L(zhǎng)PCWSTR的解決方案
最近在學(xué)習(xí)C++,遇到了一個(gè)char*轉(zhuǎn)換為L(zhǎng)PCWSTR的問題,通過查找資料終于解決了,所以下面這篇文章主要介紹了C++中char*轉(zhuǎn)LPCWSTR的解決方案,文中通過詳細(xì)的示例代碼介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01
C++中使用mutable關(guān)鍵字的場(chǎng)景分析
C++中的mutable關(guān)鍵字用于修飾類的成員變量,使其在const成員函數(shù)中可以被修改,它主要用于緩存、線程同步和調(diào)試等場(chǎng)景,以支持對(duì)象的邏輯常量性,在使用mutable時(shí),應(yīng)確保其修改不會(huì)破壞對(duì)象的外部表現(xiàn)狀態(tài),本文介紹C++中使用mutable關(guān)鍵字的場(chǎng)景分析,感興趣的朋友一起看看吧2025-02-02
c/c++的opencv椒鹽噪聲的實(shí)現(xiàn)
椒鹽噪聲是一種簡(jiǎn)單的圖像噪聲模型,通過在C/C++中利用隨機(jī)數(shù)生成器,我們可以有效地模擬這種噪聲,本文就來介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下2025-05-05
C++實(shí)現(xiàn)動(dòng)態(tài)線性表
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動(dòng)態(tài)線性表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05

