C++ 預設參數與引用傳遞:語法、用法及示例

来源:https://www.cnblogs.com/xiaowange/p/18136853
-Advertisement-
Play Games

C++ 預設參數 預設參數概述 在 C++ 中,函數參數可以擁有預設值。這意味著,在調用函數時,如果省略了某個參數,那麼將使用為該參數指定的預設值。 設置預設參數 預設參數值使用等號 = 符號進行設置,位於參數聲明的類型之後。例如: void myFunction(string country = ...


C++ 預設參數

預設參數概述

在 C++ 中,函數參數可以擁有預設值。這意味著,在調用函數時,如果省略了某個參數,那麼將使用為該參數指定的預設值。

設置預設參數

預設參數值使用等號 = 符號進行設置,位於參數聲明的類型之後。例如:

void myFunction(string country = "Norway");

在這個例子中,country 是一個參數,它的預設值為 "Norway"。這意味著,如果在調用 myFunction 時沒有顯式指定 country 參數,那麼函數將使用 "Norway" 作為其值。

示例:使用預設參數

以下示例展示瞭如何使用預設參數:

void myFunction(string country = "Norway") {
  cout << country << "\n";
}

int main() {
  myFunction("Sweden");  // 輸出:Sweden
  myFunction("India");   // 輸出:India
  myFunction();        // 輸出:Norway
  myFunction("USA");    // 輸出:USA
  return 0;
}

在該示例中,myFunction 函數有兩個調用:

  • 第一次調用顯式指定了參數 country"Sweden",因此輸出 "Sweden"
  • 第二次調用顯式指定了參數 country"India",因此輸出 "India"
  • 第三次調用沒有指定參數 country,因此使用預設值 "Norway",輸出 "Norway"
  • 第四次調用顯式指定了參數 country"USA",因此輸出 "USA"

多個參數和預設參數

函數可以擁有多個參數,其中一部分或全部都可以擁有預設值。例如:

void myFunction(string fname, int age = 18) {
  cout << fname << " Refsnes is " << age << " years old.\n";
}

int main() {
  myFunction("Liam");       // 輸出:Liam Refsnes is 18 years old.
  myFunction("Jenny", 25);  // 輸出:Jenny Refsnes is 25 years old.
  return 0;
}

在這個例子中,myFunction 函數有兩個參數:fnameageage 參數擁有預設值 18,這意味著如果在調用函數時沒有顯式指定 age 參數,那麼將使用 18 作為其值。

函數返回值和預設參數

預設參數僅適用於函數參數,不適用於函數返回值。函數的返回值類型由函數聲明中的類型決定,與預設參數無關。

總結

C++ 中的預設參數是一種方便的功能,可以簡化函數調用並提高代碼的可讀性。通過使用預設參數,您可以避免在每次調用函數時都需要顯式指定所有參數,尤其是對於那些經常使用相同值的可選參數。

C++ 函數 - 引用傳遞

引用傳遞概述

在 C++ 中,函數參數可以使用引用傳遞的方式進行傳遞。引用傳遞是指函數直接訪問函數調用者提供的變數的記憶體地址,而不是複製變數的值。這意味著函數可以直接修改調用者變數的值,而無需創建副本。

引用傳遞通常用於以下兩種情況:

  • 需要在函數中修改調用者變數的值
  • 需要在函數中傳遞大型數據結構,例如數組或對象,以避免複製數據的開銷

引用傳遞語法

引用傳遞的參數聲明與普通參數聲明類似,但需要在參數類型後面添加一個 & 符號。例如:

void swapNums(int &x, int &y);

在這個例子中,xy 是引用參數。這意味著函數 swapNums 將直接訪問調用者提供的變數的記憶體地址。

引用傳遞示例

以下示例展示瞭如何使用引用傳遞來交換兩個變數的值:

void swapNums(int &x, int &y) {
  int temp = x;
  x = y;
  y = temp;
}

int main() {
  int firstNum = 10;
  int secondNum = 20;

  cout << "Before swap: " << firstNum << " " << secondNum << endl;

  swapNums(firstNum, secondNum);

  cout << "After swap: " << firstNum << " " << secondNum << endl;

  return 0;
}

在該示例中,swapNums 函數接收兩個引用參數 xy。當調用 swapNums 函數時,它將直接訪問 firstNumsecondNum 變數的記憶體地址,並交換它們的值。

引用傳遞與值傳遞的區別

特性 引用傳遞 值傳遞
參數類型 引用類型 (int&、string& 等) 普通類型 (int、string 等)
參數傳遞 直接傳遞變數的記憶體地址 複製變數的值
修改參數值 可以修改調用者變數的值 不能修改調用者變數的值
效率 通常比值傳遞更有效 通常比引用傳遞效率低

引用傳遞的註意事項

  • 引用傳遞的參數必須在函數調用之前進行初始化。
  • 不能將空指針或野指針作為引用傳遞的參數。
  • 引用傳遞的參數不能重新綁定到其他變數。

總結

C++ 中的引用傳遞是一種強大的功能,可以提高代碼的效率和可讀性。通過理解引用傳遞的語法、用法和註意事項,您可以編寫更加簡潔、高效的 C++ 程式。

最後

為了方便其他設備和平臺的小伙伴觀看往期文章:

微信公眾號搜索:Let us Coding,關註後即可獲取最新文章推送

看完如果覺得有幫助,歡迎點贊、收藏、關註


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 0x01 概述 API 是一些預先定義的函數,提供應用程式與開發人員基於某軟體或硬體訪問一組常式的能力 Web APIs 是 W3C 組織的標準,是 JS 獨有的部分 Web API 是瀏覽器提供的一套操作瀏覽器功能和頁面元素的 API,即 DOM 與 BOM 0x02 DOM (1)簡介 文檔對象 ...
  • 1、首先構造函數為中心 function Person() { } var p = new Person(); console.log('Person::', p) console.log(p.constructor Person) 列印如下: 可以看出構造函數通過new得到實例,實例可以通過【co ...
  • 今天我為大家帶來新的作品,iOS17桌面組件神器(Scriptable)原創腳本,精美作品分享!喜歡的話就點關註吧!更多腳本正在路上... * script : ONE-Progress.js * version : 1.0.0 * author : Nicolas-kings * date : 2 ...
  • 適配器模式(Adapter Pattern) 結構型設計模式,見名知意,就是兩個不相容的介面之間的橋梁。它結合了兩個獨立介面的功能。 主要解決:常常要將一些"現存的對象"放到新的環境中,而新環境要求的介面是現對象不能滿足的。 關鍵代碼:適配器繼承或依賴已有的對象,實現想要的目標介面。 優點: 1、可 ...
  • 領域驅動設計(DDD)裡面有一堆專業術語,比如領域、子域、核心域、通用域、支撐域等等,聽著是不是覺得挺嚇人?別怕,我來帶你輕鬆搞懂它們。 如何理解領域和子域? 領域是指一定的業務範圍或問題域。在解決業務問題時,DDD 會將業務領域進行細分,將問題範圍限定在一定的邊界內,在這個邊界內建立領域模型,用代 ...
  • 策略模式(Strategy Pattern) 指對象有某個行為,但是在不同的場景中,該行為有不同的實現演算法。將每個演算法封裝在獨立的類中,使得它們可以互相替換。可以在運行時根據需要選擇不同的演算法,而不需要修改客戶端代碼。 主要解決:在有多種演算法相似的情況下,使用 if...else 所帶來的複雜和難以 ...
  • 抽象工廠模式(Abstract Factory Pattern): 是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。 在抽象工廠模式中,介面是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工 ...
  • 原理 在看雪看到一篇文章:逆向調用QQ截圖NT與WeChatOCR-軟體逆向。裡面說了怎麼調用微信和QQ本地的OCR模型,還有很詳細的分析過程。 我稍微看了下文章,多的也看不懂。大概流程是使用mmmojo.dll這個dll來與WeChatOCR.exe做通信的,也是用它來啟動和關閉WeChatOCR ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...