深入理解 C++ 數據類型:從基礎到高級應用

C++ 是一種強類型語言,這意味著每個變量都必須有明確的數據類型,以便編譯器知道如何存儲和操作數據。數據類型決定了變量的內存占用、取值范圍以及可以執行的操作。理解 C++ 的數據類型是編寫高效、安全代碼的基礎。本文將全面介紹 C++ 的數據類型,包括基本數據類型、派生類型、用戶自定義類型,以及 C++11/14/17 引入的新特性,幫助讀者掌握數據類型的核心概念和應用場景。

1. 基本數據類型(Primitive Types)

基本數據類型是 C++ 內置的最基礎的數據類型,包括整型、浮點型、字符型和布爾型。

1.1 整型(Integer Types)

整型用于存儲整數,C++ 提供了不同大小的整型以適應不同的需求:

類型大小(字節)取值范圍(32/64 位系統)
short2-32,768 到 32,767
int4-2,147,483,648 到 2,147,483,647
long4 或 8取決于平臺
long long8-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned?變體同尺寸僅非負數(范圍更大)

示例:

short age = 25;          // 短整型
int salary = 50000;      // 標準整型
long population = 8000000000L;  // 長整型
long long bigNum = 9'223'372'036'854'775'807LL;  // 長長整型(C++14 支持數字分隔符)

1.2 浮點型(Floating-Point Types)

浮點型用于存儲小數,C++ 提供三種浮點類型:

類型大小(字節)有效數字位數典型范圍
float46-7±3.4e-38 到 ±3.4e38
double815-16±1.7e-308 到 ±1.7e308
long double1618-19更大范圍

示例:

float pi = 3.14159f;     // 單精度浮點(加 'f' 后綴)
double distance = 1.496e11;  // 雙精度浮點(科學計數法)
long double preciseValue = 3.141592653589793238L;  // 擴展精度

1.3 字符型(Character Types)

字符型用于存儲單個字符或 Unicode 字符:

類型大小(字節)用途
char1ASCII 字符(如?'A'
wchar_t2 或 4寬字符(如 UTF-16)
char16_t2UTF-16 編碼(C++11)
char32_t4UTF-32 編碼(C++11)

示例:

char letter = 'A';
wchar_t wideChar = L'你';  // 寬字符(L 前綴)
char16_t utf16Char = u'😊'; // UTF-16
char32_t utf32Char = U'🚀'; // UTF-32

1.4 布爾型(Boolean Type)

bool?類型僅有兩個值:true(1)和?false(0),常用于邏輯判斷。

示例:

bool isRaining = true;
bool isSunny = false;
if (isRaining) {cout << "Take an umbrella!" << endl;
}

2. 派生數據類型(Derived Types)

派生數據類型由基本類型組合或擴展而來,包括數組、指針、引用和函數。

2.1 數組(Array)

數組是相同類型元素的集合,大小固定。

示例:

int numbers[5] = {1, 2, 3, 4, 5};  // 靜態數組
for (int i = 0; i < 5; i++) {cout << numbers[i] << " ";
}

2.2 指針(Pointer)

指針存儲變量的內存地址,可用于動態內存管理。

示例:

int x = 10;
int* ptr = &x;  // ptr 存儲 x 的地址
cout << *ptr;   // 輸出 10(解引用)

2.3 引用(Reference)

引用是變量的別名,必須在聲明時初始化。

示例:

int y = 20;
int& ref = y;  // ref 是 y 的引用
ref = 30;      // 修改 y 的值
cout << y;     // 輸出 30

2.4 函數(Function)

函數也是一種數據類型,可以定義函數指針或 Lambda 表達式。

示例:

int add(int a, int b) { return a + b; }
int (*funcPtr)(int, int) = add;  // 函數指針
cout << funcPtr(2, 3);  // 輸出 5

3. 用戶自定義類型(User-Defined Types)

C++ 允許用戶定義自己的數據類型,如結構體、類、枚舉和聯合體。

3.1 結構體(struct

結構體用于組合不同類型的數據。

示例:

struct Person {string name;int age;
};
Person p = {"Alice", 25};
cout << p.name;  // 輸出 "Alice"

3.2 類(class

類是面向對象編程的核心,支持封裝、繼承和多態。

示例:

class Rectangle {
private:int width, height;
public:Rectangle(int w, int h) : width(w), height(h) {}int area() { return width * height; }
};
Rectangle rect(10, 20);
cout << rect.area();  // 輸出 200

3.3 枚舉(enum

枚舉用于定義一組命名的常量。

示例:

enum Color { RED, GREEN, BLUE };
Color c = GREEN;
if (c == GREEN) {cout << "Go!" << endl;
}

3.4 聯合體(union

聯合體允許同一內存存儲不同類型的數據(但只能同時存一個)。

示例:

union Data {int i;float f;
};
Data d;
d.i = 42;  // 此時 d.f 的值未定義

4. C++11/14/17 新增類型

現代 C++ 引入了更強大的類型系統:

4.1?auto?自動類型推導

auto x = 42;      // x 是 int
auto name = "Bob"; // name 是 const char*

4.2?decltype?獲取表達式類型

int a = 10;
decltype(a) b = 20;  // b 的類型與 a 相同(int)

4.3?nullptr(替代?NULL

std::byte buffer[1024];  // 用于二進制數據處理

4.4?std::byte(C++17)

表示原始字節數據:

std::byte buffer[1024];  // 用于二進制數據處理

5. 其他

5.1 類型別名

別名描述示例
typedef為現有類型定義別名typedef int MyInt;
using為現有類型定義別名(C++11 引入)using MyInt = int;

5.2 標準庫類型

數據類型描述示例
std::string字符串類型std::string s = "Hello";
std::vector動態數組std::vector<int> v = {1, 2, 3};
std::array固定大小數組(C++11 引入)std::array<int, 3> a = {1, 2, 3};
std::pair存儲兩個值的容器std::pair<int, float> p(1, 2.0);
std::map鍵值對容器std::map<int, std::string> m;
std::set唯一值集合std::set<int> s = {1, 2, 3};

5.3 typedef 聲明

您可以使用?typedef?為一個已有的類型取一個新的名字。下面是使用 typedef 定義一個新類型的語法:

typedef type newname; 

例如,下面的語句會告訴編譯器,feet 是 int 的另一個名稱:

typedef int feet;

現在,下面的聲明是完全合法的,它創建了一個整型變量 distance:

feet distance;

總結

C++ 提供了豐富的數據類型,從基本類型到高級自定義類型,每種類型都有其適用場景。理解這些類型的特點和用法,有助于編寫高效、可維護的代碼。

類別關鍵點
基本數據類型int,?float,?char,?bool
派生數據類型數組、指針、引用、函數
用戶自定義類型struct,?class,?enum,?union
現代 C++ 類型auto,?decltype,?nullptr,?std::byte

掌握這些數據類型后,你可以更靈活地設計程序,并優化內存和性能。希望本文能幫助你深入理解 C++ 的數據類型系統!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81429.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81429.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81429.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

補題:K - Magic Tree (Gym - 105231K)

來源&#xff1a;問題 - K - Codeforceshttps://codeforces.com/gym/105231/problem/K 題目描述&#xff1a; 一、題目分析 本題給定一個2行m列的網格&#xff0c;從(1, 1)格子開始進行深度優先搜索&#xff0c;每個格子可到達至少一個邊相鄰的格子且不重復訪問&#xff0c;…

【Prometheus-OracleDB Exporter安裝配置指南,開機自啟】

目錄 1. 安裝Oracle Instant Client1.1 解壓安裝包1.2 創建運行時鏈接 2. 環境配置2.1 設置環境變量2.2 驗證配置 3. 安裝Oracle DB Exporter3.1 創建工作目錄3.2 解壓安裝包3.3 添加執行權限 4. 數據庫監控配置4.1 創建監控用戶&#xff08;切換到Oracle所屬用戶&#xff09; …

溯因推理思維——AI與思維模型【92】

一、定義 溯因推理思維模型是一種從結果出發,通過分析、推測和驗證,尋找導致該結果的可能原因的思維方式。它試圖在已知的現象或結果基礎上,逆向追溯可能的原因,構建合理的解釋框架,以理解事物的本質和內在機制。 二、由來 溯因推理的思想可以追溯到古希臘哲學家亞里士…

Git 基本操作(二)

目錄 撤銷修改操作 情況一 情況二 情況三 刪除文件 升級git 撤銷修改操作 在日常編碼過程中&#xff0c;有些時候&#xff0c;我們可能寫著寫著發現目前的版本的代碼越寫越挫&#xff0c;越不符合標準&#xff0c;想讓我們當前的文件去恢復到上一次提交的版本…

java使用CMU sphinx語音識別

java使用CMU sphinx語音識別 一、pom依賴1、依賴dependency2、配置倉庫repository 二、下載中文資源包1、下載中文資源包&#xff08;需要其他語言的選擇對應的文件夾即可&#xff09;&#xff0c;中文選擇Mandarin2、將下載后的文件放到項目中3、代碼-識別wav語音文件4、代碼-…

企業內訓|智能駕駛與智能座艙技術——某汽車廠商

4月25日&#xff0c;東北某市&#xff0c;TsingtaoAI團隊為某汽車廠商的智能駕駛業務和研發團隊交付“智能駕駛與智能座艙技術”課程。本課程系統講解智能汽車兩大核心領域技術架構與實現路徑。課程涵蓋智能駕駛感知層&#xff08;激光雷達/毫米波雷達/視覺融合&#xff09;、決…

【數學建模國獎速成系列】優秀論文繪圖復現代碼(二)

文章目錄 國獎論文繪圖復現代碼&#xff0c;可直接運行柱狀圖橫向柱狀圖分組柱狀圖堆疊柱狀圖堆疊柱狀圖2三維柱狀圖完整復現代碼 國獎論文繪圖復現代碼&#xff0c;可直接運行 數模比賽的繪圖是非常重要得&#xff0c;這篇文章給大家分享我自己復現的國獎優秀論文的代碼&…

GitLab CVE-2024-12444 安全漏洞解決方案

本文分享極狐GitLab 補丁版本 17.11.1, 17.10.5, 17.9.7 的詳細內容。這幾個版本包含重要的缺陷和安全修復代碼&#xff0c;我們強烈建議所有私有化部署用戶應該立即升級到上述的某一個版本。對于極狐GitLab SaaS&#xff0c;技術團隊已經進行了升級&#xff0c;無需用戶采取任…

隨機微分方程(SDE):股票價格模型、利率模型的構建

隨機微分方程&#xff08;SDE&#xff09;&#xff1a;股票價格模型、利率模型的構建 一、隨機微分方程&#xff08;SDE&#xff09;基礎&#xff1a;從確定性到隨機性的擴展 1. 定義與一般形式 隨機微分方程&#xff08;SDE&#xff09;是包含布朗運動&#xff08;隨機項&am…

【MCP Node.js SDK 全棧進階指南】高級篇(1):MCP多服務器協作架構

隨著業務規模的不斷擴大和系統復雜度的提升,單一服務器架構往往無法滿足高并發、高可用性和彈性擴展的需求。在MCP生態系統中,多服務器協作架構成為構建大規模應用的必然選擇。本文將深入探討MCP TypeScript-SDK在多服務器環境下的部署、協作和管理,以及如何構建高可用、高性…

git 修改用戶名和郵箱

在 Git 中修改用戶名和郵箱地址是常見的任務&#xff0c;這可以確保你的提交記錄使用正確的身份信息。你可以通過簡單的命令來完成這一操作。 全局配置 修改全局用戶名 要修改全局的用戶名&#xff0c;請執行以下命令&#xff1a; git config --global user.name "New…

[算法學習]——通過RMQ與dfs序實現O(1)求LCA(含封裝板子)

每周五篇博客&#xff1a;&#xff08;3/5&#xff09; 碎碎念 其實不是我想多水一篇博客&#xff0c;本來這篇是歐拉序的博客&#xff0c;結果dfs序也是可以O1求lca的&#xff0c;而且常數更優&#xff0c;結果就變成這樣了。。。 前置知識 [算法學習]——dfs序 思想 分…

spark local模式

Spark Local 模式是一種在單臺機器上運行 Spark 應用程序的模式&#xff0c;無需搭建分布式集群&#xff0c;適合開發調試、學習以及運行小規模數據處理任務。以下為你詳細介紹該模式&#xff1a; 特點 簡易性&#xff1a;無需額外配置分布式集群&#xff0c;在單機上就能快速…

用 RxSwift 實現 UITableView 的響應式綁定(超實用示例)

目錄 前言 一、環境準備 1.安裝 RxSwift 和 RxCocoa 2.導入模塊 二、實現一個簡單的UITableView 1.實現一個簡單的 UITableView 1.實現步驟 1.我們聲明一個ViewModel 2.ViewModel和UITableView 綁定 2.實現 UITableView 的代理方法 三、處理點擊事件 前言 在 iOS 開發…

【C++】通過紅黑樹封裝map和set

前言&#xff1a; 通過之前的學習&#xff0c;我們已經學會了紅黑樹和map、set。這次我們要實現自己的map和set&#xff0c;對&#xff0c;使用紅黑樹進行封裝&#xff01; 當然&#xff0c;紅黑樹內容這里就不在贅述&#xff0c;我們會復用紅黑樹的代碼&#xff0c;所以先將…

非凸科技受邀出席AI SPARK活動,共探生成式AI驅動金融新生態

4月19日&#xff0c;由AI SPARK社區主辦的“生成式AI創新與應用構建”主題沙龍在北京舉行。活動聚焦生成式AI的技術突破與產業融合&#xff0c;圍繞大模型優化、多模態應用、存內計算等前沿議題展開深度探討。非凸科技受邀出席并發表主題演講&#xff0c;深入解析金融垂直大模型…

【Java IO流】IO流詳解

參考筆記&#xff1a;【Java基礎-3】吃透Java IO&#xff1a;字節流、字符流、緩沖流_javaio-CSDN博客 目錄 1.IO流簡介 1.1 什么是IO流&#xff1f; 1.2 IO流的分類 1.3 字符流和字節流的其他區別 1.4 Java IO流體系圖 2.字符編碼詳解 3. Java的char類型與 Unicode、U…

驅動開發系列56 - Linux Graphics QXL顯卡驅動代碼分析(三)顯示模式設置

一:概述 如之前介紹,在qxl_pci_probe 中會調用 qxl_modeset_init 來初始化屏幕分辨率和刷新率,本文詳細看下 qxl_modeset_init 的實現過程。即QXL設備的顯示模式設置,是如何配置CRTC,Encoder,Connector 的以及創建和更新幀緩沖區的。 二:qxl_modeset_init 分析 in…

Vue3開發常見性能問題知多少

文章目錄 1 常見性能優化瓶頸及原因1.1 響應式數據的過度使用1.2 虛擬 DOM 的頻繁更新1.3 組件渲染的冗余1.4 大列表渲染的性能問題1.5 計算屬性和偵聽器的濫用1.6 事件處理函數的頻繁綁定1.7 異步組件的加載性能2 解決方案與優化技巧2.1 合理使用響應式數據2.2 優化虛擬 DOM 更…

Rust Ubuntu下編譯生成環境win程序踩坑指南

前言&#xff1a; 1&#xff0c;公司要給一線搞一個升級程序&#xff0c;需要在win下跑。 之前都是找開發總監幫忙&#xff0c;但是他最近比較忙。就讓我自己搞。有了下文.。說來慚愧&#xff0c;之前寫過一篇ubuntu下編譯windows的文章。里面的demo就一句話 fuck world。依賴…