C++入門一:C++ 編程概述

一、C 語言與 C++ 的關系:從 “帶類的 C” 到獨立王國

1.1 血緣關系:C++ 是 C 的 “超級進化版”

  • 起源:C++ 由 Bjarne Stroustrup 在 1980 年代開發,最初名為 “C with Classes”(帶類的 C),旨在為 C 語言增加面向對象特性。
  • 后向兼容:C++ 完全兼容 C 語言的語法和特性,C 代碼可直接在 C++ 編譯器中編譯,因此常被稱為 “C 的超集”。
  • 本質區別:C 是純面向過程語言,而 C++ 是多范式語言,支持面向過程、面向對象(OOP)和泛型編程。

1.2 核心定位對比

維度

C 語言

C++

編程范式

面向過程(Procedure-Oriented)

面向對象(OOP)+ 泛型 + 面向過程

設計目標

追求效率(底層開發、嵌入式)

兼顧效率與抽象(大型系統、復雜邏輯)

典型場景

操作系統內核、硬件驅動

游戲引擎、企業級框架、AI 算法實現

二、編程范式:面向過程 vs 面向對象

2.1 面向過程(C 語言核心)

  • 核心思想:將問題拆解為 “步驟”,通過函數調用實現邏輯。
// C語言實現兩數相加int add(int a, int b) { return a + b; }int main() { printf("%d", add(1, 2)); }
  • 優點
    • 執行效率高(無額外開銷),適合對性能敏感的場景(如單片機開發)。
    • 語法簡潔,適合快速實現小規模邏輯。
  • 缺點
    • 數據與操作分離,大型項目難以維護(如修改數據需同步修改多個函數)。
    • 代碼復用性低,相同邏輯需重復編寫。

2.2 面向對象(C++ 核心)

  • 核心思想:將數據(屬性)和操作(方法)封裝為 “對象”,通過繼承和多態實現復用。
// C++實現計算器類class Calculator {public:int add(int a, int b) { return a + b; }};int main() { Calculator calc; printf("%d", calc.add(1, 2)); }
  • 三大特性
    • 封裝:通過class隱藏內部細節,提供統一接口(如calc.add())。
    • 繼承:子類復用父類代碼(如AdvancedCalculator : public Calculator)。
    • 多態:同一接口支持不同實現(通過虛函數實現運行時動態綁定)。
  • 優點
    • 代碼結構清晰,易維護(修改對象內部不影響外部調用)。
    • 高度復用,適合復雜業務邏輯(如游戲中的角色系統、企業級框架設計)。
  • 缺點
    • 類實例化和虛函數調用有輕微性能開銷。
    • 學習曲線較陡峭(需理解類、對象、繼承等概念)。

三、具體語言特性對比:從語法到機制的差異

3.1 關鍵字與后綴名

  • 關鍵字數量
    • C 語言:32 個(如if、for、static)。
    • C++:63 個(新增class、virtual、namespace等面向對象和泛型關鍵字)。
  • 文件后綴
    • C 源文件:.c(如main.c)。
    • C++ 源文件:.cpp(VS 默認后綴,如main.cpp),部分場景用.cc或.cxx。

3.2 函數定義嚴格性

  • 返回值
    • C 語言:函數未聲明返回值時默認返回int(危險隱式轉換)。
// C語言合法,默認返回intfunc() { return 1; }
    • C++:必須顯式聲明返回值,無返回值需用void。
// C++報錯,需顯式聲明void// func() { return 1; }void func() {}
  • 參數列表
    • C 語言:未聲明參數時默認接受任意參數(類型不安全)。
int add(); // 可接受add(1, 2, 3)(未檢查參數數量)
    • C++:嚴格檢查參數類型和數量,無參數需聲明void。
int add(void); // 僅接受0個參數,調用add(1)報錯

3.3 缺省參數與函數重載:C++ 的便捷武器

  • 缺省參數(C 語言不支持):
// 半缺省參數(右側參數必須全有默認值)void print(int x, int y=10) { printf("%d %d", x, y); }// 調用:print(5); // 等價于print(5, 10)
  • 函數重載(C 語言不支持):
// 同名函數,參數類型/數量不同int add(int a, int b) { return a + b; }double add(double a, double b) { return a + b; }// 調用時自動匹配:add(1, 2) → int版;add(1.5, 2.5) → double版

3.4 const:從 “只讀變量” 到 “真正常量”

  • C 語言:const修飾的變量是 “只讀變量”,本質是變量,不可作數組下標。
const int MAX = 10;int arr[MAX]; // C語言報錯,MAX是變量
  • C++:const修飾的是 “真正常量”,編譯期確定值,可作數組下標。
const int MAX = 10;int arr[MAX]; // C++合法
  • 特殊情況:若const變量依賴運行時數據(如const int a = b;),會退化為 C 語言的只讀變量。

3.5 引用:比指針更安全的 “別名”

  • 本質:引用是變量的別名,底層實現為指針(反匯編層面與指針一致),但語法更安全(不可為空,不可重新指向)。
int a = 10;int& ref = a; // ref是a的別名,修改ref即修改aref = 20; // a變為20
  • 特殊用法
    • 引用常量:const int& ref = 10;(創建臨時量存儲 10,避免懸垂引用)。
    • 數組引用:int arr[5]; int(&ref_arr)[5] = arr;(通過引用操作整個數組)。

3.6 內存管理:從函數到運算符的進化

特性

malloc/free(C 語言)

new/delete(C++)

本質

庫函數

語言內置運算符

類型安全

需手動類型轉換(如(int*)malloc)

自動推導類型,無需轉換

初始化

僅分配內存,不初始化

可調用構造函數(如new Class())

釋放

僅釋放內存

先調用析構函數,再釋放內存

異常處理

失敗返回 NULL

失敗拋出bad_alloc異常

示例

int* p = (int*)malloc(4); free(p);

int* p = new int(10); delete p;

3.7 作用域:從二維到三維的擴展

  • C 語言:僅支持局部作用域和全局作用域,全局符號易沖突(如多個文件定義int x;報錯)。
  • C++:新增類作用域和命名空間作用域:
namespace Math { // 命名空間作用域int add(int a, int b) { return a + b; }}class Calculator { // 類作用域public: int add(int a, int b) { return a + b; }};// 調用方式:Math::add(1, 2); 或 Calculator().add(1, 2);

四、為什么先學 C 再學 C++?

4.1 打好面向過程基礎

C++ 的 “面向過程” 部分與 C 完全一致,掌握 C 能快速理解函數、指針、數組等底層概念,為學習 C++ 的類和模板打下基礎。

4.2 理解性能與抽象的平衡

C 的指針和內存管理讓開發者理解底層機制,而 C++ 的類和 STL 建立在這些機制之上,先學 C 能避免 “知其然而不知其所以然”。

4.3 無縫銜接復雜場景

C++ 的模板、異常處理等高級特性需要扎實的 C 語言功底,例如模板推導涉及指針和類型轉換,這些都是 C 語言的核心內容。

五、總結:C++ 的核心價值

5.1 一句話概括

C++ 是 C 語言的 “超級增強版”,在保持高效的同時,通過面向對象和泛型編程大幅提升復雜場景的開發效率,是連接底層硬件與上層邏輯的橋梁。

5.2 適合人群

  • C 語言開發者:直接進階,利用 OOP 簡化大型項目開發。
  • 零基礎新手:建議先學 C 打基礎,再逐步學習 C++ 的類、模板、STL 等特性。

5.3 學習路徑

  1. 掌握 C 語言基礎(指針、數組、函數)。
  1. 學習 C++ 面向對象(類、繼承、多態)。
  1. 進階泛型編程(模板、STL 容器)。
  1. 探索高級主題(內存管理、異常處理、設計模式)。

C++ 的魅力在于 “既能手寫高效底層代碼,又能搭建復雜上層架構”,是系統級開發和應用開發的 “全能選手”。從現在開始,開啟你的 C++ 之旅吧!

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

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

相關文章

LLM生成文本的 束搜索參數是什么(Beam Search)

LLM生成文本的 束搜索參數是什么(Beam Search) 束搜索(Beam Search)是一種在序列生成任務(如機器翻譯、文本生成等)中常用的啟發式搜索算法,用于在搜索空間中尋找最優的生成序列。 束搜索的基本概念 在序列生成過程中,每一步都會有多個可能的選擇(即候選標記)。 …

Java-多級排序結合thenComparing()

List<User>,user有個字段有值的時候設置1,沒值就是null,怎么排序根據這個字段排序? 若要對 List<User> 按照某個字段(如 flag,有值時為 1,無值時為 null)排序,可 以使用 ??Comparator?? 結合 null 值處理邏輯。 1. 排序規則說明?? 假設需求是:…

卷積神經網絡(CNN)基礎

目錄 一、應用場景 二、卷積神經網絡的結構 1. 輸入層&#xff08;Input Layer&#xff09; 2. 卷積層&#xff08;Convolutional Layer&#xff09; 3. 池化層&#xff08;Pooling Layer&#xff09; 最大池化&#xff08;max_pooling&#xff09;或平均池化&#xff08;…

Android 中集成 Unity 工程的步驟

在 Adroid 項目中集成 Unity 工程,主要步驟如下: 一、前提條件 1、已有一個 Android 工程項目; 2、Unity 工程已導出為 Android 工程,目錄大概如下: 二、集成步驟 1、在 Android 工程中導入 Unity 工程的 unityLibrary 模塊。 在 Android Studio 中,點擊菜單欄 Fil…

熱Key問題及其解決方案:Redis高并發場景下的性能優化

目錄 一、熱Key問題的本質與影響 1.1 什么是熱Key&#xff1f; 典型熱Key場景&#xff1a; 1.2 熱Key造成的技術挑戰與業務影響 技術層面影響&#xff1a; 業務層面影響&#xff1a; 二、熱Key的科學判定與識別方法 2.1 定量判定標準 QPS集中度指標 資源消耗指標 2.…

2025年智能 ITSM產品推薦

2025年數字經濟占GDP比重將突破62%&#xff0c;IT服務管理&#xff08;ITSM&#xff09;系統已成為企業核心競爭力的"數字底座"。根據IDC最新報告&#xff0c;采用AI驅動的智能ITSM系統可使企業運營效率提升41%&#xff0c;故障恢復成本降低58%。本文從智能化水平、產…

動手人形機器人(RL)

1 PPO的講解 核心步驟&#xff0c;如策略網絡和價值網絡的定義、優勢估計、策略更新、價值更新等基礎功能的實現 2 代碼構成 可能涉及 初始化&#xff0c;Behavior Clone 3 動手強化學習 import pytorch as torch class actorcritic ##等待補充 4 PD Gains 在機器人學中&…

Mujoco xml模型

Mujoco xml模型 一個例子compileroptionassetmesh default基本使用childclass與class多個class worldbodybody關系inertialjointgeom XML主要分為以下三個部分&#xff1a; < asset> &#xff1a; 用 tag導入STL文件&#xff1b;< worldbody>&#xff1a;用tag定義…

【Redis】背景知識

一、Redis的特性 Redis是一種基于鍵值對&#xff08;key-value&#xff09;的NoSQL數據庫&#xff0c;與很多鍵值對數據庫不同的是&#xff0c;Redis中的值可以是由string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xf…

Redis的used_memory_peak_perc和used_memory_dataset_perc超過90%會怎么樣

當Redis的used_memory_peak_perc&#xff08;當前內存占歷史峰值的百分比&#xff09;和used_memory_dataset_perc&#xff08;數據集內存占比&#xff09;均超過90%時&#xff0c;可能引發以下問題及風險&#xff1a; 一、used_memory_peak_perc > 90% 的影響 內存交換風險…

嵌入式---灰度傳感器

灰度傳感器概覽 一、定義與核心功能 1. 定義 灰度傳感器是一種基于 光反射原理 的光電傳感器&#xff0c;通過檢測物體表面對入射光&#xff08;多為紅外光或可見光&#xff09;的反射強度&#xff0c;將光信號轉換為電信號&#xff0c;從而判斷目標物體的 灰度值&#xff0…

0303hooks-react-仿低代碼平臺項目

文章目錄 1. 副作用2.其他內置hooks2.1 useEffect2.2 useRef2.3useMemo2.4 useCallback 3.自定義hooks4. 第三方hooks5. hooks使用原則6. hooks閉包陷阱7. 總結結語 1. 副作用 當組件渲染完成時&#xff0c;加載一個Ajax網絡請求當某個state更新時&#xff0c;加載一個Ajax網絡…

Zephyr、FreeRTOS、RT-Thread 定時器區別分析

一、核心特性對比 特性ZephyrFreeRTOSRT-Thread定時器類型系統定時器&#xff08;k_timer&#xff09;、硬件定時器軟件定時器&#xff08;基于系統tick&#xff09;軟件定時器、硬件定時器定時模式單次、周期性單次、自動重載&#xff08;周期性&#xff09;單次、周期、自定…

手撕unique_ptr 和 shareed_ptr

文章目錄 unique_ptrshared_ptr unique_ptr template<class T> class Unique_ptr { private:T* ptrNULL; public://1、刪除默認的拷貝構造函數Unique_ptr(Unique_ptr& u) delete;//2、刪除默認的復制構造Unique_ptr& operator(Unique_ptr& u) delete; …

對比 HashMap 和 ConcurrentHashMap 擴容邏輯的差異

HashMap 和 ConcurrentHashMap 在 擴容邏輯 上有明顯的差異&#xff0c;尤其是在并發環境下的處理策略&#xff0c;這是它們核心區別之一。 &#x1f9f1; 一、總體對比表&#xff08;JDK 8 為例&#xff09; 特性HashMapConcurrentHashMap線程安全? 否? 是是否支持并發擴容…

Linux 的準備工作

1.root用戶登錄 首先講一下root賬戶怎么登陸 直接 ssh root 公ip地址就可以了 比如我的是騰訊云的 這個就是公ip 下面所有普通用戶的操作都是在root賬戶下進行的 2.普通用戶創建 創建用戶指令 adduser 用戶名 比如說這個指令 我創建了一個ly_centos的普通用戶 3.普通用…

自動變為 VIP 文章

今天突然發現自己寫的大部分文章都被自動設為了VIP文章。 我這才想起來以前好像填過一個什么表&#xff0c;說要允許CS-DN把自己寫的文章自動設為VIP文章。 我也忘了為啥要允許CSDN動我寫的文章了&#xff0c;把幾乎所有文章都給設為VIP顯然是不合適的&#xff0c;畢竟文章是給…

Vue3+Vite+TypeScript+Element Plus開發-08.登錄設計

系列文檔目錄 Vue3ViteTypeScript安裝 Element Plus安裝與配置 主頁設計與router配置 靜態菜單設計 Pinia引入 Header響應式菜單縮展 Mockjs引用與Axios封裝 登錄設計 登錄成功跳轉主頁 多用戶動態加載菜單 文章目錄 目錄 系列文檔目錄 文章目錄 前言 一、登錄mo…

全新二手羅德SMCV100B信號發生器SMBV100A

全新二手羅德SMCV100B信號發生器SMBV100A SMCV100B信號發生器SMBV100A主要特點 適用于廣播電視、導航、蜂窩和無線應用的多標準平臺 全軟件選件定義的矢量信號發生器&#xff0c;具備 5″ 觸摸屏 全新的射頻信號生成概念&#xff0c;頻率范圍介于 4 kHz 至 7.125 GHz 輸出功率…

spring mvc @ResponseBody 注解轉換為 JSON 的原理與實現詳解

ResponseBody 注解轉換為 JSON 的原理與實現詳解 1. 核心作用 ResponseBody 是 Spring MVC 的一個注解&#xff0c;用于將方法返回的對象直接序列化為 HTTP 響應體&#xff08;如 JSON 或 XML&#xff09;&#xff0c;而不是通過視圖解析器渲染為視圖&#xff08;如 HTML&…