C++ 基礎特性深度解析

目錄

引言

一、命名空間(namespace)

C++ 中的命名空間?

與 C 語言的對比?

二、缺省參數?

C++ 中的缺省參數?

與 C 語言的對比?

三、引用(reference)?

C++ 中的引用?

與 C 語言的對比?

四、inline(內聯函數)?

C++ 中的內聯函數?

與 C 語言的對比?

與 C 語言的對比?

總結?

引言

在編程語言的發展歷程中,C++ 脫胎于 C 語言,在保留 C 語言高效性的同時,引入了諸多新特性以增強代碼的可維護性、復用性和安全性。本文將聚焦于 C++ 的命名空間、缺省參數、引用、inline(內聯函數)、函數重載這幾個基礎特性,并與 C 語言進行簡要對比,幫助大家更好地理解 C++ 的獨特之處。?

一、命名空間(namespace)

C++ 中的命名空間?

在 C++ 中,命名空間是一種將全局作用域劃分成不同子作用域的機制,用于解決命名沖突問題。當項目規模較大,不同模塊或庫中可能出現同名的變量、函數或類,命名空間可以將這些同名實體分隔開來。

namespace Math {?int add(int a, int b) {?return a + b;?}?
}?
namespace Util {?int add(int a, int b) {?return a * b + a + b;?}?
}

使用命名空間中的實體時,可以通過 命名空間名::實體名 的方式訪問,如 Math::add(3, 5);也可以通過 using namespace 命名空間名 指令引入整個命名空間,不過可能會帶來新的命名沖突風險。?

與 C 語言的對比?

C 語言沒有命名空間的概念,所有的全局標識符都位于同一個全局作用域中。在大型項目中,如果多個源文件定義了同名的全局變量或函數,就會導致命名沖突。例如,兩個不同的庫都定義了一個名為 add 的函數,鏈接時就會報錯。C 語言通常通過在命名前添加特定的前綴或后綴來避免沖突,但這種方式不夠優雅,也缺乏系統性。

二、缺省參數?

C++ 中的缺省參數?

C++ 允許在函數聲明或定義時為參數指定默認值,當函數調用時如果沒有傳遞該參數,就會使用默認值。缺省參數可以是全部參數都有默認值,也可以是部分參數有默認值,但有默認值的參數必須放在參數列表的右側。

void printInfo(string name, int age = 18) {?cout << "姓名:" << name << ",年齡:" << age << endl;?
}

調用 printInfo("Alice") 時,age 參數會使用默認值 18;調用 printInfo("Bob", 20) 時,age 則使用傳入的值 20。?

與 C 語言的對比?

C 語言不支持缺省參數,函數調用時必須為每個參數提供相應的實參。如果想要實現類似缺省參數的功能,在 C 語言中通常需要定義多個函數,通過函數重載的思想(雖然 C 語言沒有真正的函數重載)來實現不同參數組合的功能,這會增加代碼量和維護成本。例如,要實現類似上述 printInfo 函數的功能,可能需要定義兩個不同名稱的函數分別處理有年齡參數和無年齡參數的情況。

三、引用(reference)?

C++ 中的引用?

C++ 的引用是變量的一個別名,它和被引用的變量共享同一塊內存空間,定義時必須初始化,且一旦初始化后就不能再引用其他變量。引用常用于函數參數傳遞和返回值,能避免值傳遞時的拷貝開銷,提高效率,同時還可以通過引用在函數內部修改外部變量的值。

void swap(int &a, int &b) {?int temp = a;?a = b;?b = temp;?
}?
int num1 = 5, num2 = 10;?
swap(num1, num2);

這里 swap 函數通過引用參數,直接對外部的 num1 和 num2 變量進行操作,實現了交換功能。?

與 C 語言的對比?

C 語言中沒有引用的概念,在函數參數傳遞時,通常使用指針來實現類似修改外部變量的效果。例如在 C 語言中實現交換兩個整數的函數:

void swap(int *a, int *b) {?int temp = *a;?*a = *b;?*b = temp;?
}?
int num1 = 5, num2 = 10;?
swap(&num1, &num2);

雖然功能上與 C++ 的引用相似,但指針使用起來相對復雜,容易出現空指針解引用等錯誤,而引用在使用上更安全、簡潔,語法也更接近變量本身。?

四、inline(內聯函數)?

C++ 中的內聯函數?

C++ 中的內聯函數使用 inline 關鍵字修飾,它的目的是為了提高函數調用的效率。編譯器在編譯時會將內聯函數的代碼直接嵌入到調用處,避免了函數調用時的棧操作開銷(如保存現場、跳轉執行等)。不過,內聯函數的代碼通常比較短小,否則編譯器可能會忽略 inline 關鍵字,將其當作普通函數處理。

inline int square(int num) {?return num * num;?
}

調用 square(5) 時,編譯器會直接將函數體代碼替換到調用位置,類似于宏定義,但比宏更安全,因為內聯函數有類型檢查。?

與 C 語言的對比?

C 語言中沒有內聯函數的概念,類似的功能通常通過宏定義來實現。例如:

#define SQUARE(num) ((num) * (num))

宏定義只是簡單的文本替換,沒有類型檢查,可能會帶來一些意外的錯誤,比如 SQUARE(a + b) 展開后是 ((a + b) * (a + b)),如果沒有正確添加括號,可能導致結果不符合預期。而 C++ 的內聯函數有類型檢查,更加安全可靠。?

五、函數重載?

C++ 中的函數重載?

在 C++ 中,函數重載是指在同一作用域內,多個函數可以擁有相同的函數名,但參數列表(參數個數、類型、順序)必須不同。編譯器會根據函數調用時提供的實參類型和個數來匹配對應的函數版本。

int add(int a, int b) {?return a + b;?
}?
double add(double a, double b) {?return a + b;?
}

調用 add(3, 5) 會調用第一個 add 函數,返回整數結果;調用 add(3.14, 2.71) 會調用第二個 add 函數,返回浮點數結果。?

與 C 語言的對比?

C 語言不支持函數重載,每個函數必須有唯一的函數名。如果需要實現類似功能,在 C 語言中只能使用不同的函數名來區分,例如 add_int 和 add_double,這使得函數命名不夠直觀,也不利于代碼的閱讀和維護。?

總結?

C++ 的命名空間、缺省參數、引用、inline 函數和函數重載這些特性,在 C 語言的基礎上極大地增強了語言的表達能力和編程的便利性。與 C 語言相比,C++ 能夠更好地應對大型項目開發中的各種問題,提高代碼的可讀性、可維護性和運行效率。理解和掌握這些特性,是深入學習 C++ 編程的重要基礎。?

以上從多個特性對比了 C++ 與 C 語言。你對這些特性還有哪些疑問,或者想了解 C++ 其他方面與 C 語言的對比,都能隨時和我說。

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

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

相關文章

關于面試找工作的總結(四)

不同情況下收到offer后的處理方法 1.不會去的,只是面試練手2.還有疑問,考慮中3.offer/職位不滿足期望的4.已確認,但又收到更好的5.還想挽回之前的offer6.確認,準備入職7.還想拖一下的1.不會去的,只是面試練手 HR您好,非常榮幸收到貴司的offer,非常感謝一直以來您的幫助,…

什么是高考?高考的意義是啥?

能見到這個文章的群體&#xff0c;應該都經歷過高考&#xff0c;突然想起“什么是高考&#xff1f;意義何在&#xff1f;” 一、高考的定義與核心功能 **高考&#xff08;普通高等學校招生全國統一考試&#xff09;**是中國教育體系的核心選拔性考試&#xff0c;旨在為高校選拔…

L1和L2核心區別 !!--part 2

哈嘍&#xff0c;我是 我不是小upper~ 昨天&#xff0c;咱們分享了關于 L1 正則化和 L2 正則化核心區別的精彩內容。今天我來進一步補充和拓展。 首先&#xff0c;咱們先來聊聊 L1 和 L2 正則化&#xff0c;方便剛接觸的同學理解。 L1 正則化&#xff08;Lasso&#xff09;&…

字節推出統一多模態模型 BAGEL,GPT-4o 級的圖像生成能力直接開源了!

字節推出的 BAGEL 是一個開源的統一多模態模型&#xff0c;他們直接開源了GPT-4o級別的圖像生成能力。&#xff08;輕松拿捏“萬物皆可吉卜力”玩法~&#xff09;。可以在任何地方對其進行微調、提煉和部署&#xff0c;它以開放的形式提供與 GPT-4o 和 Gemini 2.0 等專有系統相…

互聯網大廠Java面試:從Spring Cloud到Kafka的技術考察

場景&#xff1a;互聯網大廠Java求職者面試 面試官與謝飛機的對話 面試官&#xff1a;我們先從基礎開始&#xff0c;謝飛機&#xff0c;你能簡單介紹一下Java SE和Java EE的區別嗎&#xff1f; 謝飛機&#xff1a;哦&#xff0c;這個簡單。Java SE是標準版&#xff0c;適合桌…

18-Oracle 23ai JSON二元性顛覆傳統

在當今百花齊放的多模型數據庫時代&#xff0c;開發人員常在關系型與文檔型數據庫間艱難取舍。Oracle Database 23ai推出的JSON關系二元性&#xff08;JSON Relational Duality&#xff09;?? 和二元性視圖&#xff08;Duality Views&#xff09;?? 創新性地統一了兩者優勢…

藍橋杯 冶煉金屬

原題目鏈接 &#x1f527; 冶煉金屬轉換率推測題解 &#x1f4dc; 原題描述 小藍有一個神奇的爐子用于將普通金屬 O O O 冶煉成為一種特殊金屬 X X X。這個爐子有一個屬性叫轉換率 V V V&#xff0c;是一個正整數&#xff0c;表示每 V V V 個普通金屬 O O O 可以冶煉出 …

DreamO字節開源圖像編輯框架

DreamO是由字節跳動聯合北京大學深圳研究生院電子與計算機工程學院共同研發的統一圖像定制生成框架&#xff0c;支持多樣化的編輯任務。 看下介紹的核心功能&#xff0c;還是很厲害的&#xff0c;今天咱們來體驗下。 有正常本地部署版的。 https://github.com/bytedance/Drea…

EM儲能網關ZWS智慧儲能云應用(11) — 一級架構主從架構

ZWS智慧儲能云針對儲能場景下不同的架構體系進行了兼容&#xff0c;可以適配用戶面臨的復雜現場環境&#xff0c;滿足更深層次的管理和維護需求。 簡介 儲能系統包含PCS、BMS、EMS等多個組件&#xff0c;不同儲能架構管理和決策方式也有不同。為了適配用戶面臨的復雜現場環境&…

從0開始一篇文章學習Nginx

Nginx服務 HTTP介紹 ## HTTP協議是Hyper Text Transfer Protocol&#xff08;超文本傳輸協議&#xff09;的縮寫,是用于從萬維網&#xff08;WWW:World Wide Web &#xff09;服務器傳輸超文本到本地瀏覽器的傳送協議。 ## HTTP工作在 TCP/IP協議體系中的TCP協議上&#…

Linux應用開發之網絡套接字編程(實例篇)

服務端與客戶端單連接 服務端代碼 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

Python SQLModel 簡介

銷量過萬TEEIS德國護膝夏天用薄款 優惠券冠生園 百花蜂蜜428g 擠壓瓶純蜂蜜巨奇嚴選 鞋子除臭劑360ml 多芬身體磨砂膏280g健70%-75%酒精消毒棉片濕巾1418cm 80片/袋3袋大包清潔食品用消毒 優惠券AIMORNY52朵紅玫瑰永生香皂花同城配送非鮮花七夕情人節生日禮物送女友 熱賣妙潔棉…

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API實戰:導出框架元素數據到Excel 在結構工程師的日常工作中,經常需要從ETABS模型中提取框架元素信息進行后續分析。手動復制粘貼不僅耗時,還容易出錯。今天我們來用簡單的VBA代碼實現自動化導出。 ?? 我們要實現什么? 一鍵點擊,就能將ETABS中所有框架元素的基…

springboot根據部署服務器生成機器碼+加密生成到期時間授權碼設置項目在服務器的到期時間

生成機器碼 首先需要在后端寫個獲取window或linux的機器碼&#xff0c;根據CPU序列號和硬盤序列號(Windows)&#xff0c;拼接得到 /*** 操作系統的工具類*/ public class OSUtils {/*** 獲取window or linux機器碼** return*/public static String getOSNumber() {Map<Str…

Thumb-2指令集及其與STM32的關系

Thumb-2指令集及其與STM32的關系&#xff1a; 1. Thumb-2指令集是什么&#xff1f; 本質&#xff1a;Thumb-2是ARM公司設計的混合指令集架構&#xff0c;首次在ARMv7架構中引入&#xff08;如Cortex-M3/M4/M7&#xff09;。 核心創新&#xff1a; 融合了傳統 32位ARM指令&…

Haption 力反饋遙操作機器人:6 自由度 + 低延遲響應,解鎖精準遠程操控體驗

Haption自2001年成立以來&#xff0c;始終專注于力反饋設備與定制化解決方案的設計、研發及銷售。作為工業級力反饋技術的先行者&#xff0c;其核心產品以高精度交互與可靠性著稱&#xff0c;已與達索系統、空客、Orano 等行業頭部企業達成深度合作&#xff0c;業務覆蓋工程仿真…

C# ExcelWorksheet 貼圖

C# ExcelWorksheet 貼圖 在C#中,如果你想在Excel工作表中插入圖片(例如,在ExcelWorksheet中貼圖),你可以使用ClosedXML或EPPlus這樣的庫來操作Excel文件。下面我將分別介紹如何使用這兩個庫來實現這一功能。 使用ClosedXML 首先,確保你已經安裝了ClosedXML包。你可以通…

Android15默認授權浮窗權限

我們經常有那種需求&#xff0c;客戶需要定制的apk集成在ROM中&#xff0c;并且默認授予其【顯示在其他應用的上層】權限&#xff0c;也就是我們常說的浮窗權限&#xff0c;那么我們就可以通過以下方法在wms、ams等系統服務的systemReady()方法中調用即可實現預置應用默認授權浮…

莫蘭迪高級灰總結計劃簡約商務通用PPT模版

莫蘭迪高級灰總結計劃簡約商務通用PPT模版&#xff0c;莫蘭迪調色板清新簡約工作匯報PPT模版&#xff0c;莫蘭迪時尚風極簡設計PPT模版&#xff0c;大學生畢業論文答辯PPT模版&#xff0c;莫蘭迪配色總結計劃簡約商務通用PPT模版&#xff0c;莫蘭迪商務匯報PPT模版&#xff0c;…

無人機EN 18031歐盟網絡安全認證詳細解讀

EN 18031 是歐盟針對無線電設備發布的網絡安全標準&#xff0c;于 2024 年 8 月正式發布&#xff0c;2025 年 1 月 30 日被列入《無線電設備指令》&#xff08;RED&#xff09;協調標準清單&#xff0c;并于 2025 年 8 月 1 日起強制執行。以下是對無人機 EN 18031 歐盟網絡安全…