国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

跟我學(xué)c++高級篇——反射

這篇具有很好參考價值的文章主要介紹了跟我學(xué)c++高級篇——反射。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、反射的概念

反射和自省,做為靜態(tài)和動態(tài)時的處理的方式,導(dǎo)致的操作手段不盡相同。那么對c++來說,如何能夠獲取數(shù)據(jù)類型,在發(fā)展到今天,已經(jīng)不是一個選擇題,而是一個必選題。語言要想生存下去,就需要不斷的創(chuàng)新和發(fā)展,不斷的完善和迭代自己,那么做為高級語言中常見的反射,c++也在通過各種手段,在悄悄的補上這一課。直到最后c++標(biāo)準(zhǔn)的引入。
什么是反射(Reflection)?就是反映程序在動態(tài)運行時,檢測、查尋和修改自身狀態(tài)或者行為的一種能力。一般來說,通過反射可以獲得:
1、指定對象的類型
2、獲得相關(guān)對象的所有的成員變量和方法(對私有和保護不同的語言可能處理方式略有不同)。
3、動態(tài)創(chuàng)建對象。
4、在動態(tài)運行時調(diào)用相關(guān)對象的方法和函數(shù)及相關(guān)屬性。
反射使語言的操作推進到了運行狀態(tài),但這不代表反射更加優(yōu)秀,他也有不少的缺點:
1、性能,反射的過程導(dǎo)致整個運行時的動作會耗費更多的運行時間。
2、降低了可維護性。因為對運行狀態(tài)期的理解不同,導(dǎo)致可能維護者對代碼的理解不同。
3、反射使整體的業(yè)務(wù)邏輯變得復(fù)雜。
正所謂因人施教,因材施教,用得恰到好處,才是真得優(yōu)秀的編程者。

二、反射的類別和應(yīng)用場景

反射一般分為動態(tài)反射和靜態(tài)反射兩大類。當(dāng)然在不同的語言中對反射的理解和處理都有些許的不同,需要注意。一般來說,動態(tài)語言如Python、c#等處理反射就非常容易,但對于靜態(tài)語言如C,c++等這種過渡性高級語言,其實處理反射就比較麻煩。但是也不能說靜態(tài)語言不能處理反射,比如c++可以通過宏或者SFINAE等技術(shù)做一些基本的反射動作。
這里要區(qū)分動態(tài)反射-靜態(tài)反射和動態(tài)語言-動態(tài)語言的不同。動態(tài)反射多是指在運行期,靜態(tài)反射多指在編譯期,所以它也叫自省。而動態(tài)語言和靜態(tài)語言則是指是否在運行期進行數(shù)據(jù)類型檢查的不同。
反射的主要應(yīng)用場景如下:
1、序列化和反序列化:這是最常用的場景。如果沒有反射,那可麻煩大了。手動自己一個個匹配字節(jié)碼吧。
2、遠程方法RMI的調(diào)用,這個有過c#和Java開發(fā)經(jīng)驗的會非常容易理解。
3、數(shù)據(jù)庫開發(fā)用的O/R Mapping,即對象關(guān)系映射。
4、設(shè)計模式中的一些應(yīng)用,如工廠模式等。
5、其它,只要涉及到反射可以得到的類型處理等的情況。
在實現(xiàn)反射的手段中,一般有兩種形式,即侵入式和非侵入式,這個通過名字就可以知道哪種效果會更優(yōu)。

三、c++中的反射

從某種角度來說,c++是不支持反射的。當(dāng)然,如果嚴格來說,c++是不支持動態(tài)反射的,但是通過一些技術(shù)手段可以實現(xiàn)靜態(tài)反射的效果。這就包括前面學(xué)習(xí)到的元編程、模板編程(SFINAE)還有宏機制等。但是需要說明的,如果在業(yè)務(wù)邏輯上通過某種技巧實現(xiàn)類似反射的結(jié)果,一般來說,這不能歸到反射上去。當(dāng)然,這個就仁者見仁了。
在早期的c++中,最典型的其實就是MFC中通過模板和宏來生動態(tài)生成類并生成類的對象,這其實就是一種反射的應(yīng)用。而在新的c++20提供了屬性,這其實就是一個進步,它其實就可以說對反射的一種支持。c++這種靜態(tài)語言會不會推出從標(biāo)準(zhǔn)上支持的反射,這個還不敢給出確切的說法(但有可能在c++26或29中支持)。
也就是說,當(dāng)前的c++標(biāo)準(zhǔn)只是在RTTI(運行期類型識別)僅僅是一個類型的判斷處理,簡單到了發(fā)指。雖然c++20(reflexpr關(guān)鍵字)提供了一些面向未來測試的實現(xiàn)方式,但目前來看,也僅僅是一個結(jié)探索,并未真正實現(xiàn),必須類似的老套的劇情發(fā)生過很多次,不斷的更新迭代版本,甚至廢棄都有可能。

四、總結(jié)

其實反射也可以放到模板元編程中來進行分析,但是為了更好的講解一些c++的高級特性,還是把它分離了出來。c++的許多高級的特性,在國內(nèi)的大多數(shù)應(yīng)用場景上,其實是應(yīng)用不到的。原因是,這些高級特性大多是在基礎(chǔ)庫支持或者基礎(chǔ)軟件上才用的。而這恰恰是國內(nèi)的軟肋。
知已知彼,百戰(zhàn)不殆??吹接惺裁床蛔悖拍芨玫难a齊它。共同努力!文章來源地址http://www.zghlxwxcb.cn/news/detail-431945.html

到了這里,關(guān)于跟我學(xué)c++高級篇——反射的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【區(qū)塊鏈 | Solidity】跟我學(xué) Solidity(7):事件

    如何使用事件記錄數(shù)據(jù) 原文:?https://medium.com/better-programming/learn-solidity-events-2801d6a99a92?作者:?wissal haji 歡迎訂閱《Solidity智能合約零基礎(chǔ)開發(fā)教程專欄》系列文章。 在今天的文章中,我們將看到如何使用web3.js從區(qū)塊鏈中讀取事件。 Solidity中的事件就像你習(xí)慣于使用其他語

    2024年01月25日
    瀏覽(60)
  • rust跟我學(xué)三:文件時間屬性獲得方法

    rust跟我學(xué)三:文件時間屬性獲得方法

    ? ???????? ?圖為RUST吉祥物 大家好,我是get_local_info作者帶劍書生,這里用一篇文章講解get_local_info是怎樣獲得殺毒軟件的病毒庫時間的。 首先,先要了解get_local_info是什么? get_local_info是一個獲取linux系統(tǒng)信息的rust三方庫,并提供一些常用功能,目前版本0.2.4。詳細介紹

    2024年01月17日
    瀏覽(24)
  • 跟我學(xué)java|Stream流式編程——并行流

    跟我學(xué)java|Stream流式編程——并行流

    并行流是 Java 8 Stream API 中的一個特性。它可以將一個流的操作在多個線程上并行執(zhí)行,以提高處理大量數(shù)據(jù)時的性能。 在傳統(tǒng)的順序流中,所有的操作都是在單個線程上按照順序執(zhí)行的。而并行流則會將流的元素分成多個小塊,并在多個線程上并行處理這些小塊,最后將結(jié)

    2024年01月25日
    瀏覽(14)
  • 安全跟我學(xué)|網(wǎng)絡(luò)安全五大誤區(qū),你了解嗎?

    安全跟我學(xué)|網(wǎng)絡(luò)安全五大誤區(qū),你了解嗎?

    網(wǎng)絡(luò)安全 盡管安全問題老生常談,但一些普遍存在的誤區(qū)仍然可能讓企業(yè)隨時陷入危險境地。為了有效應(yīng)對當(dāng)前層出不窮且不斷變換的網(wǎng)絡(luò)威脅,最大程度規(guī)避潛在風(fēng)險,深入了解網(wǎng)絡(luò)安全的發(fā)展趨勢必不可少。即使部署了最新且最先進的硬件和解決方案并嚴格遵守行業(yè)標(biāo)準(zhǔn)

    2024年01月22日
    瀏覽(20)
  • rust跟我學(xué)七:獲取外網(wǎng)IP地址

    rust跟我學(xué)七:獲取外網(wǎng)IP地址

    ???????? ???????? ?圖為RUST吉祥物 大家好,我是get_local_info作者帶劍書生,這里用一篇文章講解get_local_info是怎么獲取到本機的外網(wǎng)IP地址。 首先,先要了解get_local_info是什么? get_local_info是一個獲取linux系統(tǒng)信息的rust三方庫,并提供一些常用功能,目前版本0.2.4。詳細

    2024年01月19日
    瀏覽(22)
  • 【通知】我的教學(xué)文章《Rust跟我學(xué)》已全部上線

    大家好,我是get_local_info開源庫作者帶劍書生,現(xiàn)在我的《Rust跟我學(xué)》專欄文章已全部上線,它記錄了我在寫庫時獲得的重要Rust經(jīng)驗和技巧,是不同于《Rust語言編程》等簡單實踐的書籍。為您節(jié)省了學(xué)習(xí)時間,讓您可以快速上手熟悉Rust并進入項目。 具體介紹,請翻看我的上

    2024年01月20日
    瀏覽(18)
  • [通知]rust跟我學(xué):文件時間屬性獲得方法文章已上線

    大家好,我是帶劍書生,開源庫get_local_info的作者。目前我的付費專欄已經(jīng)上線第七篇文章,用于介紹在實現(xiàn)get_local_info過程中,遇到該問題所使用的解決方法,喜歡的朋友可以去訂閱了,19.9元,非常便宜的價格,做開源不容易。希望能幫助您在學(xué)習(xí)Rust時,少走彎路,盡快進

    2024年01月17日
    瀏覽(19)
  • 跟我學(xué)Python圖像處理丨帶你入門OpenGL

    跟我學(xué)Python圖像處理丨帶你入門OpenGL

    摘要: 介紹Python和OpenGL的入門知識,包括安裝、語法、基本圖形繪制等。 本文分享自華為云社區(qū)《[Python圖像處理] 二十七.OpenGL入門及繪制基本圖形(一)》,作者:eastmount。 1.什么是OpenGL OpenGL(Open Graphics Library,譯為“開放式圖形庫”) 是用于渲染2D、3D矢量圖形的跨語言、

    2024年02月09日
    瀏覽(18)
  • pdf文件過大如何縮小上傳?pdf壓縮跟我學(xué)

    pdf文件過大如何縮小上傳?pdf壓縮跟我學(xué)

    在我們?nèi)粘9ぷ骱蜕钪校?jīng)常會遇到PDF文件過大的問題,給文件傳輸和存儲帶來了很大的不便。那么,如何縮小PDF文件大小以便上傳呢?下面就給大家分享幾個壓縮方法,一起來了解下PDF文件壓縮方法吧~ 方法一:嗨格式壓縮大師 優(yōu)勢特點: 高效穩(wěn)定:嗨格式壓縮大師采用

    2024年02月10日
    瀏覽(89)
  • Jmeter 測試 MQ 接口怎么做?跟我學(xué)秒變大神!

    Jmeter 測試 MQ 接口怎么做?跟我學(xué)秒變大神!

    MQ(message queue)消息隊列,是基礎(chǔ)數(shù)據(jù)結(jié)構(gòu) 先進先出 的一種典型數(shù)據(jù)結(jié)構(gòu)。一般用來解決應(yīng)用解耦,異步消息,流量削鋒等問題,實現(xiàn)高性能,高可用,可伸縮和最終一致性架構(gòu)。 MQ 主要產(chǎn)品包括:RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ、Kafka MQTT 是輕量的 (Lightweight)、發(fā)布訂閱模式

    2024年02月06日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包