一些C++入門基礎

關鍵字

圖引自? C++ 關鍵詞 - cppreference.com

?命名空間

命名空間解決了C沒辦法解決的各類命名沖突問題

C++的標準命名空間:std

命名空間中可以定義變量、函數、類型:

namespace CS {//變量char cs408[] = "DS,OS,JW,JZ";int cs = 408;//函數void Func() {cout << "085400" << endl;}//類class student {public:void F() {cout << "bull and horse" << endl;}private:int a = 6;int b = 66;};
}

且命名空間可以嵌套(不常用):

namespace School {int x = 0;namespace CS {//};};

授權

命名空間未展開時,默認不能訪問命名空間

全部展開:

using namespace CS;

部分展開(僅可訪問部分已展開的變量、函數、類):

using CS::cs408;

或者加上作用域限定符直接訪問:

	CS::student st1;st1.F();

合并

如果定義了多個同名的命名空間,會自動合并:

如果合并后有多個同名變量、函數、類型,會出現重定義。

缺省參數

聲明或者定義函數時,為參數指定的缺省值,如沒有傳參時,使用缺省值:

Date(int year = 1, int month = 1, int day = 1) {};

全缺省:

Date(int year = 1, int month = 1, int day = 1) {};

半缺省(部分缺省):

半缺省參數必須從右往左給出,且不能間隔著給。

所以,調用半缺省參數的函數時,傳參必須從左往右給出,同樣不能間隔。

Date(int year, int month = 1, int day = 1) {};Date(2025);
Date(int year, int month, int day = 1) {};Date(2025,5);

注:在函數聲明和定義分離的情況下,不能為聲明和定義同時給出半缺省參數,避免聲明和定義中的缺省值不同而無法調用。

函數重載

C++允許同一作用域下存在同名函數,條件是:形參的個數 or 類型 or 順序不同:

Date(int a);
Date(int a, int b);
Date(int a, char b);
Date(char a, int b);

原理

C/C++ 中,一個程序要運行需經歷:預處理、編譯、匯編、鏈接;

(每日回顧:C程序預處理(本文包括宏定義)-CSDN博客)

在匯編階段,對于一個函數,匯編器會為其分配一個地址,并將該地址與函數名關聯起來,記錄在符號表中;在鏈接完成之后,會形成完整的符號表。符號表包含了程序中所有符號的名稱、地址和屬性等信息。

VS中,C和C++的函數名修飾規則對比

?由上圖可見,C語言僅在函數名前加 '_' 以在符號表中查找對應函數地址;而C++的函數名修飾中,還與形參有關,這也印證了前文所說函數重載的條件。

特殊情況

函數重載和缺省參數的函數同時存在可能會出現調用歧義:

//無參數 和 全缺省
void F() {};
void F(int a = 1, int b = 2) {};//一個參數 和 半缺省
void F(int a) {};
void F(int a, int b = 2) {};

引用

引用的底層和C指針一樣,只是使用更加方便;一個變量的引用,就是給這個已存在的變量取個別名,這個引用與已存在的變量共用同一塊內存空間。

int p = 0;
int& pp = p;    // pp是p的引用pp = 1;    // 修改pp,p也會隨之修改

特性

1、必須在定義時就初始化;

2、一個變量可以有多個引用:

int p = 0;
int& pp = p;
int& ppp = p;

3、引用被初始化之后,不能再改變指向;

int p = 0;
int q = 1;
int& pp = p;
pp = q;    // 報錯,不能再改變指向

使用場景

引用作為參數

void test(int& a){};
int main(){int b = 1;test(b);return 0;
}

引用作為返回值

int& test(int& a){a++;return a;
};
int main(){int b = 1;int ret = test(b);return 0;
}

?上面這段代碼,其實test函數中返回的a變量,在出了函數作用域之后已經銷毀,只不過我們用ret立刻接收了該引用的值;實際上返回的引用,已經是被釋放的空間

所以,如果函數返回時,出了函數作用域,如果返回對象還在(還沒還給系統),則可以使用引用返回,如果已經還給系統了,則必須使用傳值返回。

效率

使用傳值傳參和使用值作為返回值類型時,實際上都是實參或者返回變量的一份臨時拷貝;所以當值較大時,效率必然低于使用引用傳參或者使用引用作為返回值類型。

和指針對比

引用的底層實現,與指針相同,只不過使用時更為方便。

1、引用 在概念上是一個變量的別名,而指針存儲地址;

2、引用在定義時必須初始化指向實體,指針不必;

3、引用在初始化引用一個實體后,不能再改變指向,而指針可以;

4、sizeof(引用) 是引用類型的大小,而指針始終是地址所占字節數大小;

5、引用++ 是引用的實體++,而指針++ 是向后偏移;

6、沒有多級引用,有多級指針;

7、訪問實體方式不同:引用 編譯器會處理,而指針需要顯式解引用;

8、引用使用起來更安全。

內聯函數

以inline修飾的函數為內聯函數。

普通函數在調用時,需要建立棧幀;內聯函數會在編譯時直接展開,沒有建立棧幀的開銷,提升程序運行效率。

有點像C中的宏函數,只不過宏是完全的只有替換,而內聯函數是展開函數體。

inline void test(int a){};

特性

1、以空間換時間,但如果函數體過大,會使文件變大;

2、不同編譯器的實現不同,一般編譯器會將函數規模較小(10行左右)、且不是遞歸、且頻繁調用的函數,采用inline修飾,否則會忽略。(內聯說明只是向編譯器發出的一個請求,編譯器可以選擇忽略這個請求)

3、inline函數不建議聲明和定義分離。因為內聯函數展開后,就沒有函數地址了,只有聲明就會找不到定義,報鏈接錯誤。

auto關鍵字(C++11)

auto作為一 個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得。簡單來說,auto可以推導當前變量類型。

int a = 0;
auto b = a;
auto c = 'a';

使用auto定義變量時必須對其進行初始化,在編譯階段編譯器需要根據初始化表達式來推導auto 的實際類型。因此auto并非是一種“類型”的聲明,而是一個類型聲明時的“占位符”,編譯器在編譯期會將auto替換為變量實際的類型。

你不能使用auto來推導未知類型。

auto常用來與范圍for、lambda表達式搭配使用。

范圍for(C++11)

范圍for使得在遍歷一個有范圍的集合時,更加方便:

int arr[10] = {0};
for (auto a : arr){cout << a << endl;
}

這段代碼會依次取數組中所有的數據賦值給 a ,打印;

使用條件

1、for 循環迭代的范圍是確定的(下圖展示了不確定的范圍);

void test(int arr[]){for(auto a : arr){cout << a << endl;}
}

2、迭代的對象要實現++和==的操作。

nullptr

int* p1 = NULL;
int* p2 = 0;

在C的頭文件 stddef.h 中,有部分代碼:

(條件編譯見每日回顧:C程序預處理(本文包括宏定義)-CSDN博客)

#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

NULL實際是一個宏,可能被定義為字面常量0,或者被定義為無類型指針(void*)的常量。

但是如果有:

void test(int a)
void test(int* a){};
int main(){test(NULL);
}

那么test(NULL) 到底調用誰?這就出現了問題,C++11中通過引入關鍵字nullptr 用來初始化空指針。

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

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

相關文章

學習筆記:黑馬程序員JavaWeb開發教程(2025.4.6)

12.4 登錄校驗-JWT令牌-介紹 JWT&#xff08;JSON Web Token&#xff09; 簡潔是指JWT是一個簡單字符串&#xff0c;自包含指的是JWT令牌&#xff0c;看似是一個隨機字符串&#xff0c;但是可以根據需要&#xff0c;自定義存儲內容 Header是JSON數據格式&#xff0c;原始JSO…

香港科技大學物理學理學(科學計算與先進材料物理與技術)碩士招生宣講會——深圳大學

香港科技大學物理學理學&#xff08;科學計算與先進材料物理與技術&#xff09;碩士招生宣講會——深圳大學專場 &#x1f559;時間&#xff1a;2025年5月23日&#xff08;星期五&#xff09;14:30 &#x1f3eb;地點&#xff1a;深圳大學滄海校區致原樓1101 &#x1f9d1…

數據庫優化技巧:MySQL 重復數據查詢與刪除(僅保留一條)的性能優化策略

目錄 一、查詢重復數據 二、刪除重復數據 方法 1&#xff1a;創建臨時表&#xff0c;操作完成后再刪除臨時表&#xff08;安全可靠&#xff0c;適合大表&#xff09; 步驟 1&#xff1a;創建臨時表存儲需刪除的 ID 步驟 2&#xff1a;根據臨時表刪除數據 方法 2&#xff1a…

分布式ID生成器:原理、對比與WorkerID實戰

一、為什么需要分布式ID&#xff1f; 在微服務架構下&#xff0c;單機自增ID無法滿足跨服務唯一性需求&#xff0c;且存在&#xff1a; ? 單點瓶頸&#xff1a;數據庫自增ID依賴單表寫入 ? 全局唯一性&#xff1a;跨服務生成可能重復 ? 擴展性差&#xff1a;分庫分表后ID規…

Golang的代碼注釋規范與實踐

# Golang的代碼注釋規范與實踐 一、注釋的重要性 代碼注釋是程序員交流的橋梁 代碼注釋是程序員之間溝通交流的重要形式&#xff0c;良好的注釋能夠幫助其他開發者更快地理解代碼的意圖和實現方式。 代碼維護離不開注釋 在項目維護過程中&#xff0c;良好的注釋能夠幫助開發者回…

Qt讀取Excel文件的技術實現與最佳實踐

目錄 一、成果展示二、核心方法及原理1. QAxObject(基于COM接口)2. 第三方庫QXlsx3. ODBC數據庫驅動三、實現步驟詳解1. QAxObject讀取Excel(需安裝Excel/WPS)2. QXlsx讀取Excel(跨平臺方案)四、技術選型與對比五、應用場景與優化建議1. 高頻數據處理2. 跨平臺工具開發3.…

機器學習第十五講:決策樹全面講解:像玩“20個問題“游戲猜身份[特殊字符]

機器學習第十五講&#xff1a;決策樹全面講解&#xff1a;像玩"20個問題"游戲猜身份&#x1f3ae; 資料取自《零基礎學機器學習》。 查看總目錄&#xff1a;學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章&#xff1a;DeepSeek R1本地與線上滿血版部署&…

CCpro工程編程軟件

CXpro?? 是一個軟件應用套件&#xff0c;用以完成 ABB Cylon CB 系列 BACnet 控制器的設計、工程、編程、配置、測試、調試和維護。 主要優勢 CXpro?? 提供改進的導航和頁面命名&#xff0c;使開發人員能夠輕松地圍繞大型策略進行操作。它也允許立即訪問可快速更新的點和…

數據庫(二):ORM技術

什么是 ORM&#xff1f; ORM&#xff08;Object-Relational Mapping&#xff09; 是一種用于實現 對象模型&#xff08;面向對象&#xff09;與關系模型&#xff08;數據庫&#xff09;之間映射的技術&#xff0c;使程序員可以通過操作對象的方式訪問數據庫數據&#xff0c;而無…

系統設計——項目設計經驗總結1

摘要 在系統設計的時候&#xff0c;注意域的區分&#xff0c;功能區分、類的區分、方法區分范圍和定義。在系統設計的時候的&#xff0c;需要思考類、方法在什么情況下會涉及到修改&#xff0c;遵循記住&#xff1a;一個類應該只有一個原因被修改&#xff01; 當不滿足&#x…

【Java高階面經:微服務篇】3.熔斷機制深度優化:從抖動治理到微服務高可用架構實戰

一、熔斷抖動的本質剖析與核心成因 1.1 熔斷機制的核心價值與抖動危害 熔斷機制作為微服務彈性架構的核心組件,通過模擬電路斷路器邏輯,在服務出現異常時自動阻斷請求鏈,防止故障擴散引發雪崩。但頻繁的“熔斷-恢復-熔斷”抖動會導致: 用戶體驗惡化:請求成功率波動大,響…

深入淺出人工智能:機器學習、深度學習、強化學習原理詳解與對比!

各位朋友&#xff0c;大家好&#xff01;今天咱們聊聊人工智能領域里最火的“三劍客”&#xff1a;機器學習 (Machine Learning)、深度學習 (Deep Learning) 和 強化學習 (Reinforcement Learning)。 聽起來是不是有點高大上&#xff1f; 別怕&#xff0c;我保證把它們講得明明…

【動手學深度學習】1.1~1.2 機器學習及其關鍵組件

目錄 一、引言1.1. 日常生活中的機器學習1.2. 機器學習中的關鍵組件1&#xff09;數據2&#xff09;模型3&#xff09;目標函數4&#xff09;優化算法 一、引言 1.1. 日常生活中的機器學習 應用場景&#xff1a; 以智能語音助手&#xff08;如Siri、Alexa&#xff09;的喚醒…

Pytorch針對不同電腦配置詳細講解+安裝(CPU)

一、前言 安裝pytorch前&#xff0c;應按照我前邊的博文中&#xff0c;安裝完anaconda和pycharm&#xff0c;并且配置完環境變量以后哈。 Pytorch是什么&#xff1f; 它是一個庫,是一個開源的機器學習框架&#xff0c;專注于深度學習任務&#xff0c;由Facebook的人工智能研…

[python] 輕量級定時任務調度庫schedule使用指北

schedule是一款專為簡化定時任務調度而設計的Python庫&#xff0c;它通過直觀的語法降低了周期性任務的實現門檻。作為進程內調度器&#xff0c;它無需額外守護進程&#xff0c;輕量且無外部依賴&#xff0c;適合快速搭建自動化任務。不過&#xff0c;該庫在功能完整性上有所取…

React的合成事件(SyntheticEventt)

文章目錄 前言 前言 React的合成事件&#xff08;SyntheticEvent&#xff09;是React為了統一不同瀏覽器的事件處理行為而封裝的一套跨瀏覽器事件系統。它與原生事件的主要區別如下&#xff1a; 1. 事件綁定方式 ? 合成事件&#xff1a;使用駝峰命名法綁定事件&#xff08;如…

報表控件stimulsoft教程:如何在報表和儀表板中創建熱圖

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于創建報表和儀表板的通用工具集。該產品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他環境的完整工具集。無需比較產品功能&#xff0c;Stimulsoft Ultimate包含了…

[免費]蒼穹微信小程序外賣點餐系統修改版(跑腿點餐系統)(SpringBoot后端+Vue管理端)【論文+源碼+SQL腳本】

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的微信小程序醫院預約掛號管理系統(uni-appSpringBoot后端Vue管理端)&#xff0c;分享下哈。 項目視頻演示 【免費】蒼穹微信小程序外賣點餐系統修改版(跑腿點餐系統)(SpringBoot后端Vue管理端) Java畢業設計…

Dify 快速上手 MCP!Java 搭建 MCP Server 接入 Dify詳細實戰攻略

近期&#xff0c;MCP協議在AI領域熱度飆升&#xff0c;成為眾多開發者和行業人士熱議的焦點。下文先介紹MCP究竟是什么&#xff1f;再詳細講下 Dify DeepSeek Java開發 MCP server 實戰。 一、MCP的基本概念 MCP&#xff0c;全稱為模型上下文協議&#xff08;Model Context P…

力扣992做題筆記

左神做法的理論依據 我們可以通過 集合的包含關系 和 具體示例枚舉 來直觀理解這一推導過程。以下結合題目示例 1 進行詳細說明&#xff1a; 示例 1 分析 輸入&#xff1a;nums [1,2,1,2,3], k 2 目標&#xff1a;計算恰好包含 2 種不同整數 的子數組個數。 步驟一集合 A…