日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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


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

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


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


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


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

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

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


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

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

美國(guó)紐約州阿蒙克2022年10月20日 /美通社/ -- IBM(NYSE: IBM)發(fā)布 2022 年第三季度業(yè)績(jī)報(bào)告。 IBM 董事長(zhǎng)兼首席執(zhí)行官 Arvind Kri...

關(guān)鍵字: IBM 軟件 BSP 云平臺(tái)

(全球TMT2022年10月19日訊)10月17日晚間,安集科技披露業(yè)績(jī)預(yù)告。今年前三季度,公司預(yù)計(jì)實(shí)現(xiàn)營(yíng)業(yè)收入7.54億元至8.33億元,同比增長(zhǎng)60.24%至77.03%;歸母凈利潤(rùn)預(yù)計(jì)為1.73億元至2.34億元...

關(guān)鍵字: 安集科技 電子 封裝 集成電路制造

成都2022年10月19日 /美通社/ -- 近期,平安養(yǎng)老險(xiǎn)積極籌備個(gè)人養(yǎng)老金的產(chǎn)品設(shè)計(jì)和系統(tǒng)開(kāi)發(fā)工作,發(fā)展多樣化的養(yǎng)老金融產(chǎn)品,推動(dòng)商業(yè)養(yǎng)老保險(xiǎn)、個(gè)人養(yǎng)老金、專屬商業(yè)養(yǎng)老保險(xiǎn)等產(chǎn)品供給。 搭養(yǎng)老政策東風(fēng) ...

關(guān)鍵字: 溫度 BSP 東風(fēng) 大眾

廣東佛山2022年10月19日 /美通社/ -- 空間是人居生活的基礎(chǔ)單元,承載著生存與活動(dòng)的最基本功能。而對(duì)于理想空間的解構(gòu)意義卻在物理性容器之外,體現(xiàn)出人們對(duì)于空間和生活深層關(guān)系的思考,同時(shí)也塑造著人與空間的新型連接...

關(guān)鍵字: 溫度 BSP 智能化 進(jìn)程

上海2022年10月19日 /美通社/ -- 10月17日晚間,安集科技披露業(yè)績(jī)預(yù)告。今年前三季度,公司預(yù)計(jì)實(shí)現(xiàn)營(yíng)業(yè)收入7.54億元至8.33億元,同比增長(zhǎng)60.24%至77.03%;歸母凈利潤(rùn)預(yù)計(jì)為1.73億...

關(guān)鍵字: 電子 安集科技 BSP EPS

北京2022年10月19日 /美通社/ -- 10月18日,北京市經(jīng)濟(jì)和信息化局發(fā)布2022年度第一批北京市市級(jí)企業(yè)技術(shù)中心創(chuàng)建名單的通知,諾誠(chéng)健華正式獲得"北京市企業(yè)技術(shù)中心"認(rèn)定。 北京市企業(yè)技...

關(guān)鍵字: BSP ARMA COM 代碼

北京2022年10月18日 /美通社/ -- 10月14日,國(guó)際數(shù)據(jù)公司(IDC)發(fā)布《2022Q2中國(guó)軟件定義存儲(chǔ)及超融合市場(chǎng)研究報(bào)告》,報(bào)告顯示:2022年上半年浪潮超融合銷售額同比增長(zhǎng)59.4%,近5倍于...

關(guān)鍵字: IDC BSP 數(shù)字化 數(shù)據(jù)中心

上海2022年10月18日 /美通社/ -- 2022年9月5日,是首都銀行集團(tuán)成立60周年的紀(jì)念日。趁著首都銀行集團(tuán)成立60周年與首都銀行(中國(guó))在華深耕經(jīng)營(yíng)12年的“大日子”,圍繞作為外資金融機(jī)構(gòu)對(duì)在華戰(zhàn)略的構(gòu)想和業(yè)...

關(guān)鍵字: 數(shù)字化 BSP 供應(yīng)鏈 控制

東京2022年10月18日  /美通社/ -- NIPPON EXPRESS HOLDINGS株式會(huì)社(NIPPON EXPRESS HOLDINGS, INC.)旗下集團(tuán)公司上海通運(yùn)國(guó)際物流有限公司(Nipp...

關(guān)鍵字: 溫控 精密儀器 半導(dǎo)體制造 BSP

廣州2022年10月18日 /美通社/ -- 10月15日,第 132 屆中國(guó)進(jìn)出口商品交易會(huì)("廣交會(huì)")于"云端"開(kāi)幕。本屆廣交會(huì)上高新技術(shù)企業(yè)云集,展出的智能產(chǎn)品超過(guò)140,...

關(guān)鍵字: 中國(guó)智造 BSP 手機(jī) CAN

單片機(jī)

21600 篇文章

關(guān)注

發(fā)布文章

編輯精選

技術(shù)子站

關(guān)閉