【C++】類與對象(static、explicit、友元、隱式類型轉換、內部類、匿名對象)

🌈個人主頁:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥?系列專欄:http://t.csdnimg.cn/eCa5z

9efbcbc3d25747719da38c01b3fa9b4f.gif

目錄

再談構造函數

初始化列表

隱式類型轉換?

explicit關鍵字?

?static成員

概念

?計算程序中創建出了多少個類對象

特性

?友元

友元函數

友元類

內部類

匿名對象?

拷貝對象時的一些編譯器優化?


前言

????💬 hello! 各位鐵子們大家好哇。

? ? ? ? ? ? ?今日更新了類與對象static、explicit、友元、隱式類型轉換、內部類、匿名對象的內容
????🎉 歡迎大家關注🔍點贊👍收藏??留言📝

再談構造函數

構造函數體中的語句只能將其稱為賦初值,而不能稱作初始化。因為初始化只能初始化一次,而構造函數體內可以多次賦值。

初始化列表

初始化列表:以一個冒號開始,接著是一個以逗號分隔的數據成員列表,每個"成員變量"后面跟一個放在括號中的初始值或表達式

?


缺省值是給初始化列表的,如果沒在初始化列表初始化,就會用缺省值。如果既沒缺省值,也沒在初始化列表初始化,就是隨機值。經過了初始化列表后,才回去函數體內進行賦值修改。const int _n不能在函數體內初始化,因為它只能初始化一次,而函數體內可以多次賦值。?


?建議能用初始化列表就用初始化列表。?

注意:

  1. 每個成員變量在初始化列表中只能出現一次(初始化只能初始化一次)
  2. 類中包含以下成員,必須放在初始化列表位置進行初始化:
  • 引用成員變量
  • const成員變量
  • 自定義類型成員(且該類沒有默認構造函數時)

?盡量使用初始化列表初始化,因為不管你是否使用初始化列表,對于自定義類型成員變量, 一定會先使用初始化列表初始化。

引用在定義時就必須初始化,所以要走初始化列表。?沒有默認構造函數的自定義類型,如果沒走初始化列表,就會發生錯誤(沒有合適的默認構造)。


下面是一道初始化順序例題:

結論:成員變量在類中聲明次序就是其在初始化列表中的初始化順序,與其在初始化列表中的先后 次序無關?


隱式類型轉換?

C cc1(1)和C cc2=2都是一樣的構造。涉及到單參數構造函數支持隱式類型的轉換。

下面是隱式類型轉換的意義:

如果我們想在B類中給自定義類型的成員,我們原本只能給全局變量去初始化,現在不用了,因為有隱式類型的轉換,很方便。????????

再舉一個例子,如上圖,原本我們想push一個數進棧的時候,需要再創建一個自定義類型的對象,但是現在不用了,直接push數據就可以了。?

explicit關鍵字?

如果我們不想讓這種隱式類型轉換發生,只需要在前面加一個explicit,如下圖


上圖是多參數的隱式類型轉換,需要用花括號括起來,如果不想要轉換,可以在前面加上explicit?

?static成員

概念

聲明為static的類成員稱為類的靜態成員,用static修飾的成員變量,稱之為靜態成員變量;用 static修飾的成員函數,稱之為靜態成員函數靜態成員變量一定要在類外進行初始化

?計算程序中創建出了多少個類對象

當我們想知道構造函數的調用次數時,可以通過計數來確定。不過需要一個全局變量n,但這樣子不安全,別人可能會修改n的值。所以我們要把他封裝起來。

因為我們要默認構造和拷貝構造里的n是同一個n,就需要把n設為靜態的。而靜態的不能給缺省值,因為它不屬于某一個對象。所以它在類里面聲明,在類外面定義。?

如果我們這時候想要訪問,就需要public。但是一般情況下,我們都是設為私有,這時候就需要一個公有的成員函數。如下圖

?我們還可以將函數設為靜態的,如下圖:

這樣又多了一種方式訪問。靜態成員函數的作用一般是用來訪問靜態成員變量。

特性

  1. ?靜態成員為所有類對象所共享,不屬于某個具體的對象,存放在靜態區
  2. 靜態成員變量必須在類外定義,定義時不添加static關鍵字,類中只是聲明
  3. 類靜態成員即可用 類名::靜態成員 或者 對象.靜態成員 來訪問
  4. 靜態成員函數沒有隱藏的this指針,不能訪問任何非靜態成員
  5. 靜態成員也是類的成員,受public、protected、private 訪問限定符的限制

?友元

友元提供了一種突破封裝的方式,有時提供了便利。但是友元會增加耦合度,破壞了封裝,所以 友元不宜多用。?

友元函數

問題:現在嘗試去重載operator<<,然后發現沒辦法將operator<<重載成成員函數。因為cout的輸出流對象和隱含的this指針在搶占第一個參數的位置。this指針默認是第一個參數也就是左操作 數了。但是實際使用中cout需要是第一個形參對象,才能正常使用。所以要將operator<<重載成 全局函數。但又會導致類外沒辦法訪問成員,此時就需要友元來解決。operator>>同理。

友元函數可以直接訪問類的私有成員,它是定義在類外部的普通函數,不屬于任何類,但需要在 類的內部聲明,聲明時需要加friend關鍵字。?

下面是使用友元的方案:

  • 友元函數可訪問類的私有和保護成員,但不是類的成員函數?
  • 友元函數不能用const修飾
  • 友元函數可以在類定義的任何地方聲明,不受類訪問限定符限制
  • 一個函數可以是多個類的友元函數
  • 友元函數的調用與普通函數的調用原理相同

友元類

友元類的所有成員函數都可以是另一個類的友元函數,都可以訪問另一個類中的非公有成員。

  • 友元關系是單向的,不具有交換性。比如上述Time類和Date類,在Time類中聲明Date類為其友元類,那么可以在Date類中直接訪問Time類的私有成員變量,但想在Time類中訪問Date類中私有的成員變量則不行。
  • 友元關系不能傳遞。如果C是B的友元, B是A的友元,則不能說明C時A的友元。
  • 友元關系不能繼承,在繼承位置再給大家詳細介紹。

內部類

概念:如果一個類定義在另一個類的內部,這個內部類就叫做內部類。內部類是一個獨立的類, 它不屬于外部類,更不能通過外部類的對象去訪問內部類的成員。外部類對內部類沒有任何優越 的訪問權限。

注意:內部類就是外部類的友元類,參見友元類的定義,內部類可以通過外部類的對象參數來訪 問外部類中的所有成員。但是外部類不是內部類的友元。?

特性:

  1. 內部類可以定義在外部類的public、protected、private都是可以的。
  2. 注意內部類可以直接訪問外部類中的static成員,不需要外部類的對象/類名。
  3. sizeof(外部類)=外部類,和內部類沒有任何關系。?

?舉例:

匿名對象?

?Solution().Sum_Solution(10);這個語句,當我們需要調用某個函數時,我們原本要先創建對象,才能調用,現在只需要匿名對象就可以調用了,很方便。

拷貝對象時的一些編譯器優化?

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

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

相關文章

開源軟件的商業模式探析:開放與盈利的平衡

寫在開頭 開源軟件的概念和應用已經成為了現代科技領域中的一個重要組成部分。然而&#xff0c;雖然開源軟件的價值和影響力得到了廣泛認可&#xff0c;但如何在開放的環境中找到商業盈利的平衡卻是一個頗具挑戰性的問題。本文將深入探討開源軟件的商業模式&#xff0c;從基本…

力扣61:旋轉鏈表

題目 給你一個鏈表的頭節點 head &#xff0c;旋轉鏈表&#xff0c;將鏈表每個節點向右移動 k 個位置。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5], k 2輸出&#xff1a;[4,5,1,2,3] 示例 2&#xff1a; 輸入&#xff1a;head [0,1,2], k 4輸出&#xff1a;…

卷積神經網絡(CNN)原理與實現

卷積神經網絡(CNN) 卷積神經網絡原理卷積神經網絡的數學推導卷積層反向傳播算法數學推導卷積層實現代碼 卷積神經網絡(CNN) 卷積神經網絡原理 卷積神經網絡是一種用于圖像、語音、自然語言等數據的深度學習模型&#xff0c;其核心思想是使用卷積操作提取輸入數據的特征&…

4、通達OA代碼審計

一、文件操作 1、文件上傳配合文件包含審計 文件上傳首先確定存在漏洞的文件。和文件上傳相關的函數比如upload。在從上到下分析構造的條件1. 從 POST 請求中提取變量 P 的值。 2. 檢查 P 是否已設置且不為空字符串。 3. 如果 P 已設置且非空&#xff0c;進入包含 "inc/…

JavaScript定義函數,創建函數實例時的內部原理

1、定義一個函數&#xff0c;JavaScript內部各做了哪些事情 定義一個函數時&#xff0c;JavaScript內部執行了以下步驟&#xff1a; 解析函數聲明: 當你定義一個函數時&#xff0c;JavaScript的解析器會首先解析函數聲明。這意味著它會檢查函數聲明的語法是否正確&#xff0c;…

[NSSCTF 2nd]MyJs

做一題ejs原型鏈污染 首先是登錄界面 源碼里面提示了源碼的路由 js不熟先審計一下 const express require(express); #導入Express框架&#xff0c;用于構建Web應用程序的服務器和路由 const bodyParser require(body-parser); #導入body-parser中間件&#xff0c;用于解析…

軟考證書=職稱證書?

官方的回答 根據《計算機技術與軟件專業技術資格&#xff08;水平&#xff09;考試暫行規定》&#xff08;國人部發〔2003〕39號&#xff09;規定&#xff0c;通過考試并獲得相應級別計算機專業技術資格&#xff08;水平&#xff09;證書的人員&#xff0c;表明其已具備從事相…

學習Android的第二十二天

目錄 Android ContextMenu 上下文菜單 ContextMenu 范例 參考文檔 Android SubMenu 子菜單 范例 參考文檔 Android PopupMenu 彈出菜單 范例 參考文檔 Android ContextMenu 上下文菜單 在Android開發中&#xff0c;ContextMenu&#xff08;上下文菜單&#xff09;為…

使用Javassist 在android運行時生成類

序言 最近在寫框架&#xff0c;有一個需求就是動態的生成一個類&#xff0c;然后查閱了相關文獻&#xff0c;發現在android中動態生成一個類還挺麻煩。因次把一些內容分享出來&#xff0c;幫助大家少走彎路。 方案一 DexMaker DexMaker 是一個針對 Android 平臺的庫&#xf…

Myqsort:基于冒泡排序算法的C語言實現

我們將詳細介紹一個基于冒泡排序算法的自定義排序函數——Mysqrt。該函數通過使用用戶提供的比較函數進行元素間的比較&#xff0c;并結合swap交換函數對任意類型的數據進行排序。下面是對代碼的逐行解析。 邏輯導圖 代碼實現 // 頭文件 #include<stdio.h>// 定義比較函…

華為自動駕駛技術詳解報告分享

ADS2.0首發搭載問界M5智駕版&#xff0c;城市NCA計劃年底全國開通。2023年4月16日華為在智能汽車解決方案發布會上發布了最新的ADS2.0產品&#xff0c;硬件數量減少至27個(11個攝像頭12個超聲波雷達3個毫米波雷達1個激光雷達,ADS1.0有34個)&#xff0c;車載計算平臺改為MDC610&…

python自學2

第一階段第三章 if&#xff0c;elif&#xff0c;else語句 這個是有順序的&#xff0c;如果第一個滿足下面的就不會執行&#xff0c;else也可以不寫&#xff0c;執行的效果等同于三個獨立的if。 還可以寫的更加簡潔一些 直接輸入的參數帶入到判斷里面去 小練習&#xff1a; 做…

打造專屬投屏體驗:Windows系統投屏到iOS系統

想要將電腦投屏共享給同事或朋友&#xff0c;又擔心隱私內容泄露&#xff1f;來來來&#xff0c;這里有妙招&#xff01; AirDroid Cast網頁版讓電腦投屏變得挑剔&#xff0c;只展示你允許共享的內容。會議資料、個人照片、敏感文件&#xff0c;都將得到嚴格的篩選&#xff0c;…

云原生之容器編排實踐-ruoyi-cloud項目部署到K8S:Nacosv2.2.3

背景 前面搭建好了 Kubernetes 集群與私有鏡像倉庫&#xff0c;終于要進入服務編排的實踐環節了。本系列拿 ruoyi-cloud 項目進行練手&#xff0c;按照 MySQL &#xff0c; Nacos &#xff0c; Redis &#xff0c; Nginx &#xff0c; Gateway &#xff0c; Auth &#xff0c;…

傳輸層Transport layer (ISO15118-20:2022) (7.7 part1) -- TCPUDP

7.7 Transport layer 這段描述闡明了文檔中子條款及其所有子條款的特定要求,這些要求分別適用于私有SECC(Supply Equipment Communication Controller)和公共SECC。除非在特定子條款或其內部的任何子條款中另有說明,否則不應將私有SECC和公共SECC視為可互換的。 這意味著…

問題解決 | RuntimeError: CUDA error: invalid device ordinalCUDA kernel errors

錯誤&#xff1a; RuntimeError: CUDA error: invalid device ordinal CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING1. Compile with TO…

windows環境下Grafana+loki+promtail入門級部署日志系統,收集Springboot(Slf4j+logback)項目日志

&#x1f339;作者主頁&#xff1a;青花鎖 &#x1f339;簡介&#xff1a;Java領域優質創作者&#x1f3c6;、Java微服務架構公號作者&#x1f604; &#x1f339;簡歷模板、學習資料、面試題庫、技術互助 &#x1f339;文末獲取聯系方式 &#x1f4dd; 往期熱門專欄回顧 專欄…

動態規劃DP之背包問題4---分組背包問題

目錄 DP分析&#xff1a; 例題&#xff1a; 01背包&#xff1a; 一種物品只有一件 動態規劃DP之背包問題1---01背包問題-CSDN博客 完全背包&#xff1a;一種物品有無限件 動態規劃DP之背包問題2---完全背包問題-CSDN博客 多重背包&#xff1a;一種物品有有限…

【三維重建】【SLAM】SplaTAM:基于3D高斯的密集RGB-D SLAM(CVPR 2024)

題目&#xff1a;SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM 地址&#xff1a;spla-tam.github.io 機構&#xff1a;CMU&#xff08;卡內基梅隆大學&#xff09;、MIT&#xff08;美國麻省理工&#xff09; 總結&#xff1a;SplaTAM&#xff0c;一個新…

十個勤天生菜原價4.9元被炒到300元,2024新商機!新興創業項目!

近日&#xff0c;一則關于生菜價格暴漲的新聞引起了廣泛關注。原價4.9元的生菜&#xff0c;在短短時間內被炒至300元&#xff0c;令人咋舌。在這背后&#xff0c;除了市場供需失衡、炒作等因素外&#xff0c;我們不禁思考&#xff1a;這樣的現象背后是否隱藏著更大的商機&#…