C++ 函數

函數是一組一起執行一個任務的語句。每個 C++ 程序都至少有一個函數,即主函數 main() ,所有簡單的程序都可以定義其他額外的函數。

您可以把代碼劃分到不同的函數中。如何劃分代碼到不同的函數中是由您來決定的,但在邏輯上,劃分通常是根據每個函數執行一個特定的任務來進行的。

函數聲明告訴編譯器函數的名稱、返回類型和參數。函數定義提供了函數的實際主體。

C++ 標準庫提供了大量的程序可以調用的內置函數。例如,函數 strcat() 用來連接兩個字符串,函數 memcpy() 用來復制內存到另一個位置。

函數還有很多叫法,比如方法、子例程或程序,等等。

定義函數

C++ 中的函數定義的一般形式如下:

return_type function_name( parameter list )
{body of the function
}

在 C++ 中,函數由一個函數頭和一個函數主體組成。下面列出一個函數的所有組成部分:

  • 返回類型:一個函數可以返回一個值。return_type 是函數返回的值的數據類型。有些函數執行所需的操作而不返回值,在這種情況下,return_type 是關鍵字 void。
  • 函數名稱:這是函數的實際名稱。函數名和參數列表一起構成了函數簽名。
  • 參數:參數就像是占位符。當函數被調用時,您向參數傳遞一個值,這個值被稱為實際參數。參數列表包括函數參數的類型、順序、數量。參數是可選的,也就是說,函數可能不包含參數。
  • 函數主體:函數主體包含一組定義函數執行任務的語句。

以下是 max() 函數的源代碼。該函數有兩個參數 num1 和 num2,會返回這兩個數中較大的那個數:

// 函數返回兩個數中較大的那個數int max(int num1, int num2) 
{// 局部變量聲明int result;if (num1 > num2)result = num1;elseresult = num2;return result; 
}

函數聲明

函數聲明會告訴編譯器函數名稱及如何調用函數。函數的實際主體可以單獨定義。

函數聲明包括以下幾個部分:

return_type function_name( parameter list );

針對上面定義的函數 max(),以下是函數聲明:

int max(int num1, int num2);

在函數聲明中,參數的名稱并不重要,只有參數的類型是必需的,因此下面也是有效的聲明:

int max(int, int);

當您在一個源文件中定義函數且在另一個文件中調用函數時,函數聲明是必需的。在這種情況下,您應該在調用函數的文件頂部聲明函數。

調用函數

創建 C++ 函數時,會定義函數做什么,然后通過調用函數來完成已定義的任務。

當程序調用函數時,程序控制權會轉移給被調用的函數。被調用的函數執行已定義的任務,當函數的返回語句被執行時,或到達函數的結束括號時,會把程序控制權交還給主程序。

調用函數時,傳遞所需參數,如果函數返回一個值,則可以存儲返回值。例如:

#include <iostream>
using namespace std;// 函數聲明
int max(int num1, int num2);int main ()
{// 局部變量聲明int a = 100;int b = 200;int ret;// 調用函數來獲取最大值ret = max(a, b);cout << "Max value is : " << ret << endl;return 0;
}// 函數返回兩個數中較大的那個數
int max(int num1, int num2) 
{// 局部變量聲明int result;if (num1 > num2)result = num1;elseresult = num2;return result; 
}

把 max() 函數和 main() 函數放一塊,編譯源代碼。當運行最后的可執行文件時,會產生下列結果:

Max value is : 200

函數參數

如果函數要使用參數,則必須聲明接受參數值的變量。這些變量稱為函數的形式參數。

形式參數就像函數內的其他局部變量,在進入函數時被創建,退出函數時被銷毀。

當調用函數時,有三種向函數傳遞參數的方式:

調用類型描述
傳值調用該方法把參數的實際值賦值給函數的形式參數。在這種情況下,修改函數內的形式參數對實際參數沒有影響。
指針調用該方法把參數的地址賦值給形式參數。在函數內,該地址用于訪問調用中要用到的實際參數。這意味著,修改形式參數會影響實際參數。
引用調用該方法把參數的引用賦值給形式參數。在函數內,該引用用于訪問調用中要用到的實際參數。這意味著,修改形式參數會影響實際參數。

默認情況下,C++ 使用傳值調用來傳遞參數。一般來說,這意味著函數內的代碼不能改變用于調用函數的參數。之前提到的實例,調用 max() 函數時,使用了相同的方法。

參數的默認值

當您定義一個函數,您可以為參數列表中后邊的每一個參數指定默認值。當調用函數時,如果實際參數的值留空,則使用這個默認值。

這是通過在函數定義中使用賦值運算符來為參數賦值的。調用函數時,如果未傳遞參數的值,則會使用默認值,如果指定了值,則會忽略默認值,使用傳遞的值。請看下面的實例:

#include <iostream>
using namespace std;int sum(int a, int b=20)
{int result;result = a + b;return (result);
}int main ()
{// 局部變量聲明int a = 100;int b = 200;int result;// 調用函數來添加值result = sum(a, b);cout << "Total value is :" << result << endl;// 再次調用函數result = sum(a);cout << "Total value is :" << result << endl;return 0;
}

當上面的代碼被編譯和執行時,它會產生下列結果:

Total value is :300
Total value is :120

Lambda 函數與表達式

C++11 提供了對匿名函數的支持,稱為 Lambda 函數(也叫 Lambda 表達式)。

Lambda 表達式把函數看作對象。Lambda 表達式可以像對象一樣使用,比如可以將它們賦給變量和作為參數傳遞,還可以像函數一樣對其求值。

Lambda 表達式本質上與函數聲明非常類似。Lambda 表達式具體形式如下:

[capture](parameters)->return-type{body}

例如:

[](int x, int y){ return x < y ; }

如果沒有返回值可以表示為:

[capture](parameters){body}

例如:

[]{ ++global_x; } 

在一個更為復雜的例子中,返回類型可以被明確的指定如下:

[](int x, int y) -> int { int z = x + y; return z + x; }

本例中,一個臨時的參數 z 被創建用來存儲中間結果。如同一般的函數,z 的值不會保留到下一次該不具名函數再次被調用時。

如果 lambda 函數沒有傳回值(例如 void),其返回類型可被完全忽略。

在Lambda表達式內可以訪問當前作用域的變量,這是Lambda表達式的閉包(Closure)行為。 與JavaScript閉包不同,C++變量傳遞有傳值和傳引用的區別。可以通過前面的[]來指定:

[]      // 沒有定義任何變量。使用未定義變量會引發錯誤。
[x, &y] // x以傳值方式傳入(默認),y以引用方式傳入。
[&]     // 任何被使用到的外部變量都隱式地以引用方式加以引用。
[=]     // 任何被使用到的外部變量都隱式地以傳值方式加以引用。
[&, x]  // x顯式地以傳值方式加以引用。其余變量以引用方式加以引用。
[=, &z] // z顯式地以引用方式加以引用。其余變量以傳值方式加以引用。

另外有一點需要注意。對于[=]或[&]的形式,lambda 表達式可以直接使用 this 指針。但是,對于[]的形式,如果要使用 this 指針,必須顯式傳入:

[this]() { this->someFunc(); }();

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

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

相關文章

pycharm調整最大堆發揮最大

python程序運行時&#xff0c;怎么提高效率&#xff0c;設置pycharm最大堆過程如下&#xff1b; 一、進入設置pycharm最大堆&#xff1b; 二、進入設置pycharm最大堆&#xff1b; 如果8g設置為6g左右&#xff0c;占75%左右最佳

5個實用的 Vue 技巧

在這篇文章中&#xff0c;我們將探討五個實用的 Vue 技巧&#xff0c;這些技巧可以使你日常使用 Vue 編程更高效、更富有成效。無論你是Vue的初學者還是經驗豐富的開發者&#xff0c;這些技巧都能幫助你編寫更清晰、更簡潔、更有效的代碼。那么&#xff0c;讓我們開始吧。 1. …

9.1 C++ STL 排序、算數與集合

C STL&#xff08;Standard Template Library&#xff09;是C標準庫中的一個重要組成部分&#xff0c;提供了豐富的模板函數和容器&#xff0c;用于處理各種數據結構和算法。在STL中&#xff0c;排序、算數和集合算法是常用的功能&#xff0c;可以幫助我們對數據進行排序、統計…

【JVM】JVM中的分代回收

文章目錄 分代收集算法什么是分代分代收集算法-工作機制MinorGC、 Mixed GC 、 FullGC的區別是什么 分代收集算法 什么是分代 在java8時&#xff0c;堆被分為了兩份&#xff1a; 新生代和老年代【1&#xff1a;2】 其中&#xff1a; 對于新生代&#xff0c;內部又被分為了三…

eclipse常用設置

1、調整編輯頁面字體大小 窗口 (Window)- 首選項&#xff08;Preferences&#xff09;- 常規&#xff08;General&#xff09;- 外觀 (Appearence)- 顏色與字體 (Colors And Fonts)&#xff0c;在右邊的對話框里選擇 Java - Java Editor Text Font&#xff0c;點擊出現的修改&…

【ARM 嵌入式 編譯系列 3.3 -- gcc 動態庫與靜態庫的鏈接方法介紹】

文章目錄 1.1 GCC 鏈接器 LD 介紹1.1.1 GCC 鏈接器 LD 常用參數介紹1.2 動態庫和靜態庫介紹1.2.1 動態庫和靜態庫優缺點1.2.2 庫文件鏈接方式1.2.3 ldd 工具介紹1.2.4 靜態庫鏈接時搜索路徑順序1.2.5 動態庫鏈接時、執行時搜索路徑順序1.2.6 頭文件搜索路徑1.2.7 有關環境變量上…

Neo4j之Aggregation基礎

在 Neo4j 中&#xff0c;聚合&#xff08;Aggregation&#xff09;是對數據進行計算、匯總和統計的過程。以下是一些使用聚合函數的常見例子&#xff0c;以及它們的解釋&#xff1a; 計算節點數量&#xff1a; MATCH (p:Person) RETURN count(p) AS totalPersons;這個查詢會計…

Socks5代理在多線程爬蟲中的應用

在進行爬蟲開發過程中&#xff0c;我們常常需要處理大量的數據&#xff0c;并執行多任務并發操作。然而&#xff0c;頻繁的請求可能會引起目標網站的反爬機制&#xff0c;導致IP封禁或限制訪問。為了規避這些限制&#xff0c;我們可以借助Socks5代理的強大功能&#xff0c;通過…

Nginx反向代理技巧

跨域 作為一個前端開發者來說不可避免的問題就是跨域&#xff0c;那什么是跨域呢&#xff1f; 跨域&#xff1a;指的是瀏覽器不能執行其他網站的腳本。它是由瀏覽器的同源策略造成的&#xff0c;是瀏覽器對javascript施加的安全限制。瀏覽器的同源策略是指協議&#xff0c;域名…

2011-2021年數字普惠金融指數Bartik工具變量法(含原始數據和Bartik工具變量法代碼)

2011-2021年數字普惠金融指數Bartik工具變量法&#xff08;含原始數據和Bartik工具變量法代碼&#xff09; 1、時間&#xff1a;2011-2020&#xff08;省級、城市&#xff09;&#xff0c;2014-2020&#xff08;區縣&#xff09; 2、原始數據來源&#xff1a;北大金融研究中心…

npm的鏡像源和代理的查看和修改

一、鏡像源 查詢當前鏡像源 npm get registry 設置為淘寶鏡像 npm config set registry http://registry.npm.taobao.org/ 設置回默認的官方鏡像 npm config set registry https://registry.npmjs.org/ 設置electron為淘寶鏡像 npm config set ELECTRON_MIRROR "h…

Redis對象類型和結構、內存回收、對象共享

對象類型和結構 在Redis中&#xff0c;無論是鍵key還是值value都是一個對象&#xff0c;每次對Redis數據庫創建一個新的鍵值對時&#xff0c;就至少會創建兩個對象。 常見的對象類型有&#xff1a; 字符串列表哈希集合有序集合 這些對象在Redis中統一用一個結構體redisObjec…

VS2019生成的DLL,給QT(MinGW版本)使用的小結

VS2019端&#xff1a; a 基于生成一個DLL的工程&#xff08;要注意生成是x86&#xff0c;還是x64的&#xff0c;需要和后面的QT的App工程對應&#xff09;&#xff0c;這里不多解釋了&#xff0c;網上多的是&#xff1b; b 在cpp實現文件里&#xff0c;假如要導出一個這樣的…

Git如何上傳文件到github

Git下載網址&#xff1a; https://git-scm.com/downloads 1. 新建一個空文件夾&#xff0c;用來上傳文件&#xff0c;第一次需創建&#xff0c;以后無需創建 2. 點進去空文件夾&#xff0c;鼠標右鍵&#xff0c;使用Git Bash Here 打開 3. 克隆遠程倉庫&#xff1a;git cl…

深入理解JVM——垃圾回收與內存分配機制詳細講解

所謂垃圾回收&#xff0c;也就是要回收已經“死了”的對象。 那我們如何判斷哪些對象“存活”&#xff0c;哪些已經“死去”呢&#xff1f; 一、判斷對象已死 1、引用計數算法 給對象中添加一個引用計數器&#xff0c;每當有一個地方引用它時&#xff0c;計數器就加一&…

解決git reset --soft HEAD^撤銷commit時報錯

今天在使用git回退功能的時候&#xff0c;遇到以下錯誤&#xff1a; 解決git reset --soft HEAD^撤銷commit時報錯 問題&#xff1a; 在進行完commit后&#xff0c;想要撤銷該commit&#xff0c;于是使用了git reset --soft HEAD^命令&#xff0c;但是出現如下報錯&#xff1…

【學習心得】安裝cuda/cudann和pytorch

一、查看驅動信息 # 進入CMD輸入命令 nvidia-smi 也可以右下角圖標打開NVIDIA 設置進行查看 二、下載安裝CUDA 1、下載 下載地址 https://developer.nvidia.com/ 2、安裝 推薦自定義安裝。建議只勾選Cuda&#xff0c;只安裝這一個就好&#xff0c;以免報錯安裝失敗。 3、驗證…

移動端直播相關技術總結

一、直播APP原理 二、直播APP架構 三、直播APP實現流程 四、流媒體開發 流媒體模塊架構 流媒體相關基礎知識 幀&#xff1a;每一幀代表一幅靜止的圖像 GOP&#xff1a;Group of Pictures&#xff0c;畫面組&#xff0c;一個GOP就是一組連續的畫面&#xff0c;很多幀的集合 碼率…

BC136 KiKi去重整數并排序

給定一個整數序列&#xff0c;KiKi想把其中的重復的整數去掉&#xff0c;并將去重后的序列從小到大排序輸出。 輸入描述 第一行&#xff0c;輸入一個整數n&#xff0c;表示序列有n個整數。 第二行輸入n個整數&#xff08;每個整數大于等于1&#xff0c;小于等于1000&#xf…

nodejs與前端js大文件、切片、視頻流相關技術示例

nodejs服務代碼 const express require("express"); const fs require("fs");const app express(); // 展示html頁面 app.get("/", function (req, res) {res.sendFile(__dirname "/index.html"); });// nodejs切片讀取文件示例 …