【c++】構造函數(下)——初始化列表

Hello,everybody!構造函數的內容比較多,語法還有些復雜。我分成了兩篇文章進行講解,大家在看過構造函數(上)后再來看這篇文章更容易理解喲!

1.初始化列表的格式

類似這種格式,在初始化列表中第一行用冒號開頭,剩下的用逗號開頭。初始化列表結束后,后面才是函數體。

初始化列表也是初始化類中成員的一種方式,就目前這個例子感覺在初始化列表中初始化與在函數體中初始化沒啥區別。咱們還無法窺探其中的奧妙。

不過我先給大家一個建議:

能用初始化列表,就用初始化列表,用不了的時候再考慮用函數體初始化。

下面開始介紹初始化列表獨特的地方:

1.其實初始化列表才是類中成員定義的地方,初始化列表優先于函數體運行,等程序走到函數體時,類中的所有成員都已經被定義過了。這就意味著初始化后不可被修改的成員和定義時必須初始化的成員等只能通過初始化列表初始化。例如被const修飾過的成員和引用等。

被const修飾過的x就不能通過函數體初始化,因為x在初始化列表中已經定義并初始化過了(盡管我們沒有寫出來)。在函數體中做的工作是賦值,修改。

還有一個就是引用,因為引用要求在定義的時候必須初始化。

看過以上兩個例子可以知道,就算初始化列表中什么都不寫,它也會幫我們把類中的成員都定義好,然后我們在函數體中給成員修改,賦值。如果在初始化列表中直接完成初始化,就省去了在函數體中修改數據這一步驟,程序效率相對來說要高一點。

另外要補充一點:

既然初始化列表是成員定義的地方,那么同一成員變量只能被定義一次,不能被多次定義。

2.當類中的成員變量有自定義類型時

在上文中,我們提到:引用成員變量和const成員變量只能在初始化列表中初始化。

這里補充最后一條:自定義類型成員也只能在初始化列表中初始化。

在構造函數(上)中,我們提到:對于編譯器默認生成的構造函數,在對象實例化后對于內置類型不做處理,對于自定義類型回去調用它的默認構造函數。

在這個例子中,Date類型的成員中有一個A類型,在對象實例化后編譯器直接調用了A的默認構造函數看似好像沒啥問題,實際上和前兩行的黑體字表達的意思有所出入。

注意:在Date類型中,我們已經把默認構造函數寫出來了,這個構造函數不是編譯器默認生成的為什么還會回去調用A中的默認構造函數呢?

實際上是"大道同歸"。編譯器默認生成的構造函數也好,自己寫的構造函數也好,在調用函數體前,都會先運行初始化列表,在初始化列表中不管我們寫與不寫,都會幫我們定義好A _aa。在定義的過程中就相當于對象實例化,自然就會調用A中的默認構造函數!

那問題來了!如果A中沒有默認構造函數呢?比如,我把缺省參數去掉:

這時我們就需要在Date中構造函數的初始化列表中手動給A _aa初始化,否則會因為A中沒有可以調用的默認構造函數而報錯。

3.初始化列表與函數體搭配運用

除了引用成員變量,const成員變量和類成員變量,其他成員變量的初始化既可以在初始化列表中,也可以在函數體中,但建議在初始化列表中,原因在上文已經介紹的很清楚了。

雖然初始化列表的功能很強大,但也有它無法完成的任務,這時就需要和函數體配合使用:

如果需要動態開辟空間,在初始化列表中可以完成。但是空間是否開辟成功需要進行檢查,初始化列表就無法勝任了,需要搭配函數體使用。再比如一個數組的初始化需要用到循環語句,初始化列表也是無法完成的!

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

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

相關文章

力扣每日一題 使二叉樹所有路徑值相等的最小代價 滿二叉樹 貪心

Problem: 2673. 使二叉樹所有路徑值相等的最小代價 文章目錄 思路復雜度Code 思路 👨?🏫 靈神題解 復雜度 ? 時間復雜度: O ( n ) O(n) O(n) 🌎 空間復雜度: O ( 1 ) O(1) O(1) Code class Solution {public int minIncrements(int …

ai智能電銷機器人搭建需要注意什么?人工智能電話機器人源碼技術

電銷機器人的出現,讓越來越多的企業意識到了電銷機器人的好處,不僅提高了工作效率,也讓我們更省心,但我們在選擇電話機器人的時候應該注意看語音識別技術、看話術模板制造、還要看公司研制才能等。 一、電銷機器人的選擇要素 1、看…

拿金幣 藍橋杯ALGO1006 有一個N x N的方格,問如何走才能拿到最多的金幣

問題描述 有一個N x N的方格,每一個格子都有一些金幣,只要站在格子里就能拿到里面的金幣。你站在最左上角的格子里,每次可以從一個格子走到它右邊或下邊的格子里。請問如何走才能拿到最多的金幣。 輸入格式 第一行輸入一個正整數n。   以下n行描述該方格。金幣數保證是不超過…

Vue+SpringBoot打造無代碼動態表單系統

目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 動態類型模塊2.2 動態文件模塊2.3 動態字段模塊2.4 動態值模塊 三、系統設計3.1 用例設計3.2 數據庫設計3.2.1 動態類型表3.2.2 動態文件表3.2.3 動態字段表3.2.4 動態值表 四、系統展示五、核心代碼5.1 查詢檔案類型5.…

通過vue實現左側樹狀右側的組件

隨著后臺管理項目的開發&#xff0c;左側樹狀&#xff0c;右側則為列表的需求越來越多&#xff0c;還有就是拆分該數組&#xff0c;只展示其中一個對象等需求。廢話不多說&#xff0c;直接上代碼 <template><div><el-row :gutter"20"><el-col …

(四)優化函數,學習速率與反向傳播算法--九五小龐

多層感知器 梯度下降算法 梯度的輸出向量表明了在每個位置損失函數增長最快的方向&#xff0c;可將它視為表示了在函數的每個位置向那個方向移動函數值可以增長。 曲線對應于損失函數。點表示權值的當前值&#xff0c;即現在所在的位置。梯度用箭頭表示&#xff0c;表明為了增…

GEE入門篇|圖像處理(三):閾值處理、掩膜和重新映射圖像

閾值處理、掩膜和重新映射圖像 本章前一節討論了如何使用波段運算來操作圖像&#xff0c; 這些方法通過組合圖像內的波段來創建新的連續值。 本期內容使用邏輯運算符對波段或索引值進行分類&#xff0c;以創建分類圖像。 1.實現閾值 實現閾值使用數字&#xff08;閾值&#xf…

PXE網絡啟動實戰(第一篇 啟動WinPE)

免責聲明:文中有一些圖片來源自網絡,如有版權請通知我刪除,謝謝! 目錄 一、無盤站 二、PXE啟動 三、PXE啟動原理 四、啟動WinPE 1、服務器準備 2、客戶端 3、TFTP服務 4、WinPE選擇 5、具體操作: 預告 一、無盤站 網絡啟動最早用于無盤系統,那時的電腦只配備軟…

【python量化】多種Transformer模型用于股價預測(Autoformer, FEDformer和PatchTST等)_neuralforecast

寫在前面 在本文中&#xff0c;我們利用Nixtla的NeuralForecast框架&#xff0c;實現多種基于Transformer的時序預測模型&#xff0c;包括&#xff1a;Transformer, Informer, Autoformer, FEDformer和PatchTST模型&#xff0c;并且實現將它們應用于股票價格預測的簡單例子。 …

Libero集成開發環境中Identify應用與提高

Libero集成開發環境中Identify應用與提高 Identify的安裝

小米手機相冊閃退

環境&#xff1a; HyperOS 1.0 小米手機分身 處理步驟&#xff1a; 1&#xff09;清理相冊緩存&#xff1a;設置->應用設置->相冊->清理數據->清除緩存&#xff08;注意&#xff1a;別點清理全部數據&#xff1b;這個方法對我沒用&#xff09;。 2&#xff09;卸…

操作系統原理與實驗——實驗三優先級進程調度

實驗指南 運行環境&#xff1a; Dev c 算法思想&#xff1a; 本實驗是模擬進程調度中的優先級算法&#xff0c;在先來先服務算法的基礎上&#xff0c;只需對就緒隊列到達時間進行一次排序。第一個到達的進程首先進入CPU&#xff0c;將其從就緒隊列中出隊后。若此后隊首的進程的…

多租戶 TransmittableThreadLocal 線程安全問題

在一個多租戶項目中&#xff0c;用戶登錄時,會在自定義請求頭攔截器AsyncHandlerInterceptor將該用戶的userId,cstNo等用戶信息設置到TransmittableThreadLocal中,在后續代碼中使用.代碼如下: HeaderInterceptor 請求頭攔截器 public class HeaderInterceptor implements Asyn…

阿里云國際云服務器全局流量分析功能詳細介紹

進行全局流量分析時&#xff0c;內網DNS解析會作為一個整體模塊&#xff0c;其他模塊的邊緣虛框顏色會置灰&#xff0c;示意作為一個整體進行全局分析&#xff0c;左側Region可以展開/匯總&#xff0c;也可以單獨選中某個Region模塊進行分析&#xff08;這時其他Region的流量線…

【Java面試題】Redis的用途

以下是一些常見的用途 1.緩存 Redis 可以用作緩存系統&#xff0c;&#xff0c;將頻繁訪問的數據存儲在內存中&#xff0c;從而加快數據訪問速度&#xff0c;減少對數據庫的訪問壓力。 2.消息隊列 Redis 支持發布/訂閱模式和列表數據結構&#xff0c;可以用作消息隊列系統的…

道可云元宇宙每日資訊|廈門首個元宇宙辦稅大廳啟用

道可云元宇宙每日簡報&#xff08;2024年3月1日&#xff09;訊&#xff0c;今日元宇宙新鮮事有&#xff1a; 中國軍號元宇宙發布會即將舉行 近日&#xff0c;解放軍新聞傳播中心中國軍號即將正式上線。中國軍號元宇宙發布會也將在“云端”與您見面。全方位展現解放軍新聞傳播…

加密與安全_探索簽名算法

文章目錄 概述應用常用數字簽名算法CodeDSA簽名ECDSA簽名小結 概述 在非對稱加密中&#xff0c;使用私鑰加密、公鑰解密確實是可行的&#xff0c;而且有著特定的應用場景&#xff0c;即數字簽名。 數字簽名的主要目的是確保消息的完整性、真實性和不可否認性。通過使用私鑰加…

云服務器購買教程

在購買云服務器之前&#xff0c;建議仔細評估自身需求和預算&#xff0c;并與多個云服務提供商進行比較&#xff0c;以確保選擇到最適合的解決方案。購買云服務器的具體步驟可能因所選云服務提供商而異。以下以實際操作的方式介紹如何購買一款云服務器。 云服務器購買常見問題…

【數倉】zookeeper軟件安裝及集群配置

相關文章 【數倉】基本概念、知識普及、核心技術【數倉】數據分層概念以及相關邏輯【數倉】Hadoop軟件安裝及使用&#xff08;集群配置&#xff09;【數倉】Hadoop集群配置常用參數說明 一、環境準備 準備3臺虛擬機 Hadoop131&#xff1a;192.168.56.131Hadoop132&#xff…

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之基于類型的轉換器

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之基于類型的轉換器 一、自定義轉換二、轉換器消歧(Disambiguation)三、基于類型的轉換器3.1 寫轉換3.2 讀轉換3.3 注冊轉換器 一、自定義轉換 下面的Spring Converter實現示例將String對象轉換為自定義Email值對象: R…