www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導讀]1 從過程到對象——類概念的引入 真實世界是由“對象”組成的,無論是動物、植物、工廠還是機器等,都是根據(jù)它們的特征,細分出來的對象類別。盡管在軟件設計時,更多時候我們面對的是經(jīng)過高度抽象化的模型,


1 從過程到對象——類概念的引入
    真實世界是由“對象”組成的,無論是動物、植物、工廠還是機器等,都是根據(jù)它們的特征,細分出來的對象類別。盡管在軟件設計時,更多時候我們面對的是經(jīng)過高度抽象化的模型,但最終需要解決的還是真實世界中的問題。因此,如果能夠在軟件設計中按照對象來進行建模,將更加契合真實世界的情況,有利于解決高度復雜的實際問題。典型的過程化程序設計語言,如C語言,其程序設計更傾向于面向過程,以函數(shù)為基本單位。這在自頂向下設計方法深入人心的今天,往往有些力不從心,因為它很難恰如其分地模擬真實世界。
    對于C++語言來說,設計的基本單位是類。類是邏輯上相關的函數(shù)與數(shù)據(jù)的封裝,它是對所要處理的問題的抽象描述。引入了類概念的面向對象程序設計語言C++具有更高的代碼集成度,從而更適合用于大型復雜程序的開發(fā)。而由類產(chǎn)生的基類、繼承、派生、模板等概念,更是極大地豐富了軟件工程師解決問題的手段。如此強大的概念,如若使用不當,必然帶來許多意想不到的隱患。為此MISRA C++:2008中專門討論了與類使用相關的問題,簡單舉例如下。
    規(guī)則10-1-3(強制): 同一層級的某個基類不允許既是虛基類又是非虛基類。
    這是因為,如果一個基類在多重繼承層次中既是虛類型,又是非虛類型,則在派生出來的相應對象中將至少有2個該基類的子對象拷貝。這可能與開發(fā)人員的理解不一致。為了更好說明這個問題,請看下面的程序:

   
    上述程序中,由于B1、B2是對A的public virtual繼承,而B3是對A的public繼承。因此,對于C而言,將保有A的2個子對象拷貝,造成不必要的冗繁,并隱含造成開發(fā)人員誤解的危險因素。所以,雖然這段程序在語法上是沒有錯誤的,但是出于程序安全性角度的考慮,這種使用方法被MISRA C++:2008所禁止。
    我們知道,通過將數(shù)據(jù)(屬性)和函數(shù)(行為)封裝在稱為對象的包中,可以實現(xiàn)數(shù)據(jù)和函數(shù)的緊密聯(lián)系,構成對象對信息的隱藏性。這樣,盡管對象知道怎樣通過定義好的接口實現(xiàn)相互的通信,但是對象通常并不知道其他對象是怎樣實現(xiàn)的,對象的細節(jié)隱藏在對象的內部。而同一類對象則具有相同的特點,新建立的對象通過繼承現(xiàn)有類的特征而派生出來,同時可以包含各自獨有的特點。
    也就是說,“類”很好地解決了2個問題:程序模塊化封裝的實現(xiàn),以及合理提高代碼的利用率。對于軟件設計者之外的用戶而言,每一個對象都是給出了特定接口的“黑盒子”;而對于特定的數(shù)據(jù)結構,經(jīng)過單一定義之后,就可以借用繼承主體、修改細節(jié)的手段,來實現(xiàn)重復利用。如此高效的統(tǒng)籌兼顧,源于“類”這個嶄新概念的引入。然而這種高效也需要嚴格的規(guī)范來保證,否則會帶來意想不到的隱患。為此MISRA C++:2008從類、派生類、成員訪問的控制、特殊的成員函數(shù)以及模板這幾個方面進行了詳細的討論,并出于安全角度考慮,提出了一系列規(guī)則。下面就結合MISRA C++:2008中的相關規(guī)則,對這2個問題作進一步闡述。


2 統(tǒng)——數(shù)據(jù)與代碼的封裝
    對象的獨立性是通過封裝實現(xiàn)的,這是指將抽象得到的數(shù)據(jù)成員和代碼成員相結合,形成一個統(tǒng)一的有機整體,也就是說,將數(shù)據(jù)與操作數(shù)據(jù)的行為進行有機的結合、統(tǒng)一。
    通過封裝,一部分成員作為類與外部的接口,其他成員則被很好地隱蔽起來,以實現(xiàn)對數(shù)據(jù)訪問權限的合理控制,使程序中不同部分之間的相互影響減小到最低。這樣可以達到增強安全性和簡化程序編寫工作的目的。但是在進行封裝時,疏忽一些細節(jié)可能會得到與程序設計者初衷相去甚遠的結果,看下面的例子。
    規(guī)則9-3-1(強制): 常量類型的成員函數(shù)不允許返回非常量類型的指針或對類數(shù)據(jù)的引用。
    當對象被聲明為常量型的類時,只有該類的常量成員函數(shù)能被人們調用。當調用常量成員函數(shù)時,人們一般認為將不會改變對象的狀態(tài)。然而,當常量類型的函數(shù)返回1個指向類數(shù)據(jù)的非常量指針或者對類數(shù)據(jù)的引用時,理論上將允許改變對象的狀態(tài)。這是程序設計者不希望看到的。
    作為保護數(shù)據(jù)、實現(xiàn)模塊化編程的手段,一個完全無法被外部訪問的“封裝”是沒有意義的。因此在利用封裝來限制對對象的修改操作時,必須留出必要的“接口”。這些接口通常必須以對象的成員函數(shù)的形式給出,否則可能會破壞封裝的效果。再看下面的例子。
    規(guī)則9-3-2(強制): 成員函數(shù)不允許返回對于類數(shù)據(jù)的非常量的旬柄。
    利用類的成員函數(shù)構建類的訪問接口時,可以就對象狀態(tài)是如何被修改的保留更多的控制能力,同時可以實現(xiàn)在對類進行維護時不會受到用戶的影響。返回類數(shù)據(jù)的句柄,將使得用戶可以不經(jīng)過類的接口而對類的狀態(tài)進行修改,從而破壞了封裝。
    而合理的做法如下所述。
    規(guī)則9-3-3(強制): 將成員函數(shù)聲明為static或者const類型。
    這是因為,將成員函數(shù)聲明為static或者const類型,可以限制對于其非靜態(tài)數(shù)據(jù)成員的訪問,從而避免無意識下對數(shù)據(jù)進行的修改。
    每一個對象都有和簡單變量類似的建立過程,我們希望也能夠像對待普通變量那樣,當通過聲明語句分配內存空間之后,立即寫入特定的數(shù)據(jù)。但由于對象的復雜性以及封裝需求決定了直接賦值不可行,為此C++嚴格規(guī)定了初始化程序的接口形式,并有一套自動的調用機制。這里所說的初始化程序就是構造函數(shù),這個特殊的成員函數(shù)以及與之對應的析構函數(shù),需要在封裝時給予特別的注意。
    規(guī)則12-1-1(強制): 對象的動態(tài)類型不允許在其構造函數(shù)或者析構函數(shù)體內被調用。
    在對象的構造和析構過程中,它最終的類型可能會與完整構造的對象不一樣。在構造函數(shù)或者析構函數(shù)中使用對象的動態(tài)類型,將可能與開發(fā)人員的預期不一致。對象的動態(tài)類型使用在如下的結構中:
    ◆典型的具有虛函數(shù)或者其基類中具有虛函數(shù);
    ◆dynamic_cast;
    ◆對于虛函數(shù)的虛調用。
    此規(guī)則同樣禁止由構造函數(shù)和析構函數(shù)產(chǎn)生的對純虛函數(shù)的調用。那樣的調用將導致未定義的行為。下面來看一個較為特殊的函數(shù)——拷貝構造函數(shù),以結束對封裝的討論。
    拷貝構造函數(shù)是一種特殊的構造函數(shù),其形參是本類的對象的引用。其作用是使用1個已經(jīng)存在的對象(由拷貝構造函數(shù)的參數(shù)指定的對象)去初始化1個新的同類的對象。
    規(guī)則12-8-1(強制): 拷貝構造函數(shù)只允許對基類以及它所在類的非靜態(tài)成員進行初始化。
    如果編譯器接口發(fā)現(xiàn)1個對拷貝構造函數(shù)的調用是冗余的,它將忽略該函數(shù)調用。即使拷貝構造函數(shù)在構造對象之外還有其他功能,也不例外。這稱作拷貝省略。因此當修改程序狀態(tài)的次數(shù)不能確定時,保證不使用拷貝構造函數(shù)修改程序的狀態(tài),就顯得極為重要。相關例程如下:


    上述例子里,在所有函數(shù)調用之后,m_static的數(shù)值由使用的是何種編譯器來決定,不是明確的值。這種不確定因素很可能帶來嚴重的安全隱患,顯然不是我們希望看到的。


3 籌——概念與代碼的重復利用
    運籌學中一個經(jīng)典的例子是:用2個鍋同時煎雞蛋,每個雞蛋要煎2面,每煎1面1分鐘,問煎好3個雞蛋最少要多少時間?對這個簡單例子的解決過程反映了我們的思考習慣:面對新事物新問題時,首先考慮的是如何充分利用現(xiàn)有的工具和概念,如果需要的話,在此基礎上作盡可能小的改動。繼承與派生就是這種思想在C++中的體現(xiàn)。
    按照真實世界的情況,在軟件設計中引入了類的概念。同時我們注意到人們的特定思維習慣:當提到兩廂小轎車時,遵循著“交通工具→汽車→轎車→兩廂小轎車”的具象化過程,而不是從螺絲釘開始想象。對于C++而言,面對新對象,首先想到的不是從成員開始重新構建它,而是去尋找這個新對象與已有對象類別的相似之處,看能不能最大限度利用已經(jīng)給出定義的類來描述這個新對象。為新對象創(chuàng)建的特殊類,具有一般類的全部屬性與服務,稱作特殊類對一般類的繼承。1個類可以單獨存在,但是當利用繼承機制使用該類時,該類就成為給其他類提供屬性和行為的基類,或者成為繼承其他類的屬性和行為的派生類。
    合理使用繼承可以顯著提高代碼的利用率。規(guī)則10-1-2(強制): 只有在菱形結構中才允許將基類聲明為虛基類。
    虛基類會引入許多未定義和潛在的容易令人混淆的特性。因此,只有當該基類在菱形繼承結構中作為公共基類時,才可以將其聲明為虛基類。
   

    上述例程中,對于C而言,有兩個父類B1、B2,有1個祖父類A,從而A、B1、B2、C構成了典型的菱形結構。使用了虛基類的菱形結構里,對象的內存布局中只有1個A,即祖父類的部分只有1份,且放在最后面,排放順序是B1+B2+C+A。如果沒有用虛繼承機制,那么在C對象的內存布局中會出現(xiàn)2份A部分,這也就是所謂的V型繼承。相應的對象布局為A+B1+A+B2+C。在V型繼承中不能直接從C(即孫子類)直接轉型到A(即祖父類)因為在對象的布局中有2份祖父類的實體,分別從B1、B2而來。編譯器在決議時會存在二義性,它不知道轉型后到底用哪一份實體。可以通過先轉型到某一父類,然后再轉型到祖父類來解決。但使用這種方法時,如果改寫了祖父類的成員變量的內容,runtime不會同步2個祖父類實體的狀態(tài),因此可能會有語義錯誤。
    多繼承結構允許1個對象繼承來自不同對象的特征,但也會帶來新的問題。我們看下面的規(guī)則。規(guī)則10-2-1(推薦): 多繼承層級中,可訪問的實體名稱應當是相互獨立、不同的。如果名稱含混不清,編譯器將報告名稱沖突,同時不會武斷生成不符合預期的代碼。但是這種含混不清對于開發(fā)者來說,并不容易察覺。當成員函數(shù)是虛函數(shù)時,還有一個需要特別注意的地方:通過explicitly引用基類來解決名稱含混的問題,將會去除函數(shù)的“虛”特性。對于本條規(guī)則也有例外的情況,比如:相關的重載函數(shù)應當看作具有相同的入口。相關說明程序如下:

    
    上述程序定義D時,無法分辨成員中的count和foo()到底來自B1還是B2,造成了不必要的困擾。代碼重用的目的是按不同方式重復使用代碼來實現(xiàn)類、結構、函數(shù)等,這就要求代碼必須是通用的,且通用代碼不受使用數(shù)據(jù)類型和操作的影響,即無論使用什么數(shù)據(jù)類型通用代碼都是不變的。于是C++提出了類模板的概念:類模版可以為類聲明1種模式,使得類中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某些成員函數(shù)的返回值能取任意類型。MISRA C++:2008就模板的使用也給出了詳細的規(guī)則。
    規(guī)則14-5-2(強制): 當具有單參數(shù)的模版構造函數(shù)時,必須聲明拷貝構造函數(shù)。
    與開發(fā)人員預期的不同,模版的構造函數(shù)不會禁止編譯器生成拷貝構造函數(shù)。這樣當成員函數(shù)要求進行深拷 貝的時候,可能會導致不正確的拷貝語句被執(zhí)行。這樣的問題往往在程序設計初期不會引起重視,等到面對莫名其妙的問題時,再回過頭來尋找原因,只能一籌莫展。如果在程序設計時就遵循MISRA C++:2008中相關的規(guī)則,自然可以避免這樣的困擾。


4 小 結
    本文是學習MISRA C++系列連載講座之三。從“統(tǒng)籌兼顧”的角度和大家一起學習討論了MISRA C++:2008中關于類、派生類、成員訪問的控制、特殊的成員函數(shù)以及模版的相關規(guī)則。其中有意思的例子還有很多,限于篇幅,就不一一展開敘述了。請繼續(xù)關注本系列講座的第4講:異常機制的使用。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉