《電子技術應用》
您所在的位置:首頁 > 通信與網絡 > 設計應用 > 用C語言實現類封裝的研究
用C語言實現類封裝的研究
2016年微型機與應用第21期
楊韜
廣州致遠電子股份有限公司,廣東 廣州 510660
摘要: 多年以來,C語言在嵌入式軟件開發中被廣泛使用,但由于開發人員和應用場景等原因,面向對象、設計模式等優秀的軟件開發方法始終沒有很好地運用起來。時至今日,物聯網等應用的興起,給嵌入式軟件開發帶來新的挑戰,而傳統的面向過程開發已經難以支撐這些復雜的應用。因此,有必要在嵌入式軟件開發中引入面向對象、設計模式等優秀的軟件開發方法。面向對象是現代軟件方法的根基,面向對象體現在類上,而封裝為類的第一大特性。文章以類的封裝特性為切入點,結合C語言的特性,討論了C語言實現類封裝的方法,并給出了實例。
Abstract:
Key words :

  楊韜

  (廣州致遠電子股份有限公司,廣東 廣州 510660)

       摘要:多年以來,C語言在嵌入式軟件開發中被廣泛使用,但由于開發人員和應用場景等原因,面向對象、設計模式等優秀的軟件開發方法始終沒有很好地運用起來。時至今日,物聯網等應用的興起,給嵌入式軟件開發帶來新的挑戰,而傳統的面向過程開發已經難以支撐這些復雜的應用。因此,有必要在嵌入式軟件開發中引入面向對象、設計模式等優秀的軟件開發方法。面向對象是現代軟件方法的根基,面向對象體現在上,而封裝為類的第一大特性。文章以類的封裝特性為切入點,結合C語言的特性,討論了C語言實現類封裝的方法,并給出了實例。

  關鍵詞:C語言;面向對象;類;封裝

0引言

  物聯網等應用的興起,給嵌入式軟件開發帶來新的挑戰,而傳統的面向過程開發已經難以支撐這些復雜的應用。因此,有必要在嵌入式軟件開發中引入面向對象、設計模式等優秀的軟件開發方法。本文首先介紹了面向對象必要的基本概念,然后引入了UML類圖,通過使用C語言來實現一個Human類,討論了如何使用C語言來實現類的封裝特性,并給出了對應的分析。

1基本概念

  1.1對象[1]

  對象是人們要進行研究的任何事物,從最簡單的整數到復雜的飛機等均可看作對象,它不僅能表示具體的事物,還能表示抽象的規則、計劃或事件。

  對象具有狀態,一般用數據值來描述它的狀態。

  對象還有操作,用于改變對象的狀態,對象及其操作就是對象的行為。

  對象實現了數據和操作的結合,使數據和操作封裝于對象的統一體中。

  1.2面向對象

  簡而言之,面向對象就是把客觀存在或主觀抽象的事物(即對象)抽象成類。

  所謂抽象就是去異求同,從眾多的事物(即對象)中抽取出共同的、本質性的特征,舍棄其非本質的特征。比如香蕉、蘋果、哈密瓜等,它們共同的特性就是水果。得出水果概念的過程就是一個抽象的過程。在抽象時,同與不同,取決于從什么角度上來抽象。抽象的角度取決于分析問題的目的。

  具有相同特性(數據元素)和行為(功能)的對象的抽象就是類。因此,對象的抽象是類,類的具體化就是對象,也可以說類的實例是對象。

  1.3類

  面向對象有三大特性:封裝、繼承、多態,這些特性主要通過類來體現。類就是一個封裝了屬性以及相關操作的代碼的邏輯實體。

  類具有屬性,它是對象的狀態的抽象,用數據結構來描述類的屬性。

  類具有方法,它是對象的行為的抽象,用方法名和實現該操作的方法來描述。

  除了封裝屬性和操作外,類還具有訪問控制的功能,比如,某些屬性和方法可以是私有的,不能被外界訪問,通過訪問控制,能夠對內部數據提供不同級別的保護,以防止外界意外地改變或使用了私有部分。不同的編程語言提供的訪問控制等級不盡相同,但都有公有、私有兩個等級。

  類是抽象的數據類型,在內存中并不存在(Python等動態語言除外),只有類的實例存在于內存中。

2UML類圖

  在面向對象設計開發中,通常使用UML工具來進行分析設計。比如,可以使用UML類圖來描述類。

  UML類圖很簡單,用一個矩形框代表一個類,矩形框內部被隔為三部分:上面部分為類的名字,中間部分為類的屬性,下面部分為類的方法。對于屬性和方法,還可以使用“+”、“-”修飾符來表示訪問權限,“+”為公有屬性、“-”為私有屬性。

  如圖1所示,該類圖描述了一個名為“Human”的類?!癏uman”類抽象并封裝了“人”;屬性“name”是對人姓名的抽象,因為人的姓名是公開的,所以被設置為公有屬性;屬性“money”是對人所擁有的財富的抽象,因為每個人的財富都不是公開的,所以被設置為私有屬性;方法“buy”是對購物這一行為的抽象,方法“talk”是對講話這一行為的抽象,這兩個方法都是社會活動,所以被設置為公有屬性。

圖像 009.png

  設計類的過程就是抽象的過程,抽象的結果取決于抽象時所站的角度,比如,如果是警察來抽象“Human”,他可能會添加一個“isBadGuy”屬性。

  UML類圖主要用于輔助分析和設計階段,在設計類時應聚焦在與當前問題有關的重要屬性和行為,無關的屬性和方法統統去掉,確保UML類圖是簡潔有效的。除非私有屬性或方法會影響到問題的理解或者類的實現,否則UML類圖中不要出現私有屬性和方法,私有屬性通常在實現階段才會去考慮。

  UML類圖以及其他UML元素都是輔助軟件開發的工具,使用UML進行設計時,只要相關人員能夠通過UML圖看懂你的設計、不妨礙溝通就可以了,即使用草稿紙來作圖也是可以的,所以,不用太過糾結那些細節,且一定要避免過度設計。

3C語言的類封裝實現

  很多現代編程語言都有原生的面向對象支持,比如C++、JAVA、Python等,這些編程語言提供了class數據類型,在這些編程語言中類實際上就是一種數據類型,因此能夠更好地支持面向對象編程。

  實際上,面向對象是與編程語言無關的,更像是一種思想,且不局限于軟件開發活動,任何需要分析解決問題的場合都可以使用面向對象。

  C語言并沒有類的概念,但是可以從類的特性出發,利用C語言的某些特性來實現類的用法。關于類,首先要解決的就是封裝問題,類的封裝特性需要能夠封裝屬性和方法,還要有訪問控制。可以使用.h、.c文件和結構體來完成封裝。

  下面以圖1中Human類的C語言實現為例來敘述C語言的類封裝問題,本文使用human.h、human.c、struct human三個元素來完成封裝,human.c為human.h中函數聲明的實現,本文不討論這些細節,所以只給出human.h的關鍵代碼片段,如下所示:

  typedef struct human {

  const char *name;

  int _money;

  } human_t;

  human_t *human_init(human_t *p_this, const char *name, intmoney);

  voidhuman_talk(human_t*p_this, const char*p_words);

  voidhuman_buy(human_t*p_this, const char *p_something, unsignedprice, unsignedcount);

  voidhuman_deinit(human_t *p_this);

  (1)類名

  Human類的名稱體現在human.c、human.h以及human.h中所有全局符號的命名上,這些命名全部使用關鍵字human作為前綴。

  (2)屬性

  Human類的屬性體現在自定義類型human_t中,human_t實際上為結構體struct human,它有兩個成員:name和_money,分別對應類圖中的屬性+name和-money,特別留意_money成員前的“_”,這是為了警示類的使用者“此成員為私有屬性,不可使用”。

  (3)方法

  Human類的方法體現在human_talk()、human_buy()這兩個函數上,分別對應類圖中的方法+buy()和+talk()。此外,還可以注意到有human_init()、human_deinit()這兩個函數,分別為Human類的構造、析構方法。構造、析構方法分別用于類對象的初始化和解初始化。

  構造函數human_init()需要用戶提供Human對象的內存,通過第一個參數p_this傳遞,對象的內存等價于一個human_t變量。

  C語言中可以使用C文件中的static函數實現私有方法,假如Human類有私有方法money_pay(),則其C語言實現如下:

  // human.c

  static int __human_money_pay (human_t *p_this, unsignedcost)

  { … }

  UML類圖中一般不會顯式地出現構造、析構和私有這三種方法,除非需要在類的構造、析構和實現上有特殊說明。

  另外需要注意的是,這幾個方法函數的第一個參數都是human_t *類型,且名稱為p_this,這是C語言面向對象編程與面向過程的最大不同:p_this為指向類實例(即對象)的指針,所有的方法操作都需要“針對”一個對象,p_this指針由類的構造函數返回,比如,human_init()構造一個Human實例,然后返回指向此實例的p_this指針,然后就可以調用human_talk(p_this, …)等方法對實例進行操作。

  (4)訪問控制

  在Human類的C語言實現中,屬性被定義為human_t中的兩個成員,而 human_t被定義在用戶可見的human.h中,所以human_t是暴露給用戶的,因此,從語法上講,Human類的兩個屬性是暴露給用戶的,即都是公有屬性。雖然語法上不能支持私有,但可以在編程規范上設定“私有屬性以短下劃線“_”開頭”,比如“_money”,如此從某種意義上實現了屬性的訪問控制。

  在Human類的C語言實現中,方法被定義為human.c中的函數。公共方法對應的函數都沒有“static”關鍵字,且在human.h中有對應的函數聲明。而私有方法對應的函數都有“static”關鍵字,這些私有方法只能在human.c文件內部調用,對用戶不可見。由此可知,C語言本身就能支持方法的訪問控制。

4結論

  本文通過使用C語言實現一個Human類,討論了如何使用C語言來實現類的封裝特性。在C++等面向對象語言中,使用class對類做了原生的支持,使用起來非常簡單。盡管C語言并不是原生支持類,但通過語言、概念、規范上的處理,也能實現類的封裝特性。用C語言實現類的封裝相當于解決了C面向對象的關鍵第一步,在其基礎之上可以引入更多現代軟件方法。

  參考文獻

 ?。?] 百度. 百度百科/面向對象[EB/OL].[2016-08-08].http://baike.baidu.com/link?url=6XlXEOSlrKn87S7SJv4UW SX7EjstoDVm wJ13OAod XUrUrnZkVg3ntPFir Ey5c6mqObZZ OevQI6K3Ungq1Mq.


此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          老司机aⅴ在线精品导航| 欧美日韩另类字幕中文| 国产午夜精品久久久| 国产精品高潮呻吟久久av黑人| 狼人天天伊人久久| 欧美精品日韩一本| 亚洲欧洲三级| 国产精品色在线| 久久国产福利国产秒拍| 毛片av中文字幕一区二区| 国产精品久久国产精麻豆99网站| 国产精品一二三四区| 久久久久久噜噜噜久久久精品| 国产美女高潮久久白浆| 免费久久精品视频| 欧美图区在线视频| 中文无字幕一区二区三区| 91久久精品www人人做人人爽| 亚洲乱码国产乱码精品精天堂| 国产区精品在线观看| 欧美一区亚洲一区| 欧美一区二区免费观在线| 亚洲欧美精品在线观看| 欧美三级乱人伦电影| 欧美亚洲系列| 国产在线成人| 久久精品天堂| 欧美日韩一区综合| 欧美激情一区二区三级高清视频| 亚洲理论电影网| 欧美精品二区三区四区免费看视频| 欧美日韩三区四区| 欧美亚洲一级| 韩国视频理论视频久久| 国产嫩草一区二区三区在线观看| 亚洲欧美制服另类日韩| 欧美亚洲一区在线| 欧美韩日亚洲| 欧美在线免费| 国产性猛交xxxx免费看久久| 欧美在线播放高清精品| 国产精品爱啪在线线免费观看| 亚洲日本va在线观看| 国产欧美一区二区白浆黑人| 好看的亚洲午夜视频在线| 欧美成人伊人久久综合网| 久久久久国产免费免费| 国产精品看片资源| 欧美日韩 国产精品| 欧美综合77777色婷婷| 欧美一区二区三区另类| 国产精品毛片在线| 亚洲免费在线视频一区 二区| 亚洲一区二区三区中文字幕在线| 久久久久久久尹人综合网亚洲| 国产精品美女久久久| 久久久久久成人| 亚洲一区综合| 亚洲欧美日本国产有色| 亚洲视频在线观看视频| 男女激情视频一区| 国产精品一级二级三级| 激情懂色av一区av二区av| 国产亚洲精品v| 狼人天天伊人久久| 亚洲美女视频在线观看| 一本到12不卡视频在线dvd| 欧美性色综合| 一区视频在线播放| 在线亚洲自拍| 国产精品麻豆欧美日韩ww| 精品不卡视频| 久久精品女人天堂| 欧美视频在线观看| 国产精品成人一区二区| 亚洲美女中出| 美腿丝袜亚洲色图| 国产欧美日韩精品一区| 国产精品久久国产三级国电话系列| 久热re这里精品视频在线6| 日韩一级精品| 国产精品免费看片| 国产亚洲欧洲997久久综合| 欧美黄色免费网站| 国产一区二区看久久| 久久国产一区二区| 一本一道久久综合狠狠老精东影业| 亚洲精品视频免费在线观看| 欧美日韩在线不卡一区| 亚洲午夜在线视频| 久久九九久精品国产免费直播| 欧美成人免费全部观看天天性色| 亚洲片在线观看| 国内偷自视频区视频综合| 久久婷婷国产麻豆91天堂| 亚洲一二三区视频在线观看| 欧美va天堂va视频va在线| 一区二区三区四区蜜桃| 麻豆国产精品一区二区三区| 欧美精品二区三区四区免费看视频| 在线一区二区三区四区五区| 久久久久久久久久久一区| 亚洲日本欧美日韩高观看| 亚洲精品之草原avav久久| 一本色道久久精品| 国产日韩欧美精品| 欧美日韩国产综合视频在线观看中文| 激情伊人五月天久久综合| 亚洲尤物影院| 亚洲色图自拍| 狠狠入ady亚洲精品| 午夜老司机精品| 欧美多人爱爱视频网站| 欧美日韩高清在线一区| 国产日韩精品一区二区| 欧美日韩在线不卡| 国产精品亚洲第一区在线暖暖韩国| 欧美一区二区三区男人的天堂| 国产一区二区三区精品欧美日韩一区二区三区| 久久av一区二区三区亚洲| 欧美日韩大陆在线| 免费在线观看日韩欧美| 欧美精品成人91久久久久久久| 国产精品xxxav免费视频| 亚洲国产成人av好男人在线观看| 亚洲午夜一级| 亚洲在线1234| 亚洲国产视频一区| 亚洲国产日韩精品| 欧美日韩在线播放一区| 国产日韩视频| 亚洲成人在线网| 亚洲精品影视在线观看| 国产区精品视频| 欧美大秀在线观看| 亚洲在线视频一区| 一区二区精品| 一区精品在线| 最新国产乱人伦偷精品免费网站| 精品电影在线观看| 午夜视黄欧洲亚洲| 在线观看不卡| 国产精品av免费在线观看| 久久久av毛片精品| 国产精品亚洲综合天堂夜夜| 久久久精品动漫| 国产精品一级二级三级| 91久久精品www人人做人人爽| 在线日韩av永久免费观看| 欧美在线观看视频一区二区三区| 日韩亚洲欧美在线观看| 欧美亚洲午夜视频在线观看| 欧美午夜精品久久久| 国产午夜精品全部视频在线播放| 中文欧美在线视频| 免费精品视频| 午夜伦理片一区| 欧美在线1区| 免费观看成人www动漫视频| 国产精品网红福利| 欧美视频二区36p| 亚洲你懂的在线视频| 欧美日韩免费区域视频在线观看| 毛片精品免费在线观看| 亚洲精品久久7777| 欧美成人午夜剧场免费观看| 一区二区三区久久网| 欧美精品色网| 性欧美大战久久久久久久免费观看| 亚洲欧美日韩第一区| 久久国产精品72免费观看| 国产欧美精品在线观看| 亚洲精品一区久久久久久| 午夜在线观看免费一区| 亚洲精品一区在线| 久久露脸国产精品| 亚洲精品社区| 亚洲精品一区二区在线观看| 欧美日韩三级电影在线| 91久久精品国产91性色| 美女视频黄a大片欧美| 欧美激情欧美激情在线五月| 国产一区二区三区丝袜| 久久久久综合一区二区三区| 久久先锋影音| 国产欧美精品va在线观看| 在线免费高清一区二区三区| 欧美在线不卡视频| 久久电影一区| 亚洲欧美大片| 一本久久精品一区二区| 国产欧美日韩视频一区二区| 欧美一级在线视频| 麻豆精品视频在线| 久久免费黄色| 久久成人国产| 在线播放中文一区| 亚洲卡通欧美制服中文| 国产伦精品一区二区三区照片91| 国产精品免费观看在线| 亚洲精品国产精品国自产观看浪潮| 久久一区二区三区超碰国产精品| 正在播放亚洲一区| 欧美国产综合视频| 欧美综合77777色婷婷| 欧美精品 国产精品| 欧美一区二区三区四区视频| 亚洲日本中文字幕区| 一区二区三区国产在线观看| 欧美va天堂va视频va在线| 欧美日韩一本到| 国产日韩精品一区二区浪潮av| 欧美午夜不卡影院在线观看完整版免费| 好吊妞**欧美| 欧美伦理视频网站| 欧美亚洲日本网站| 久久久精品国产一区二区三区| 在线亚洲自拍| 欧美日韩视频免费播放| 99热在这里有精品免费| 国产免费成人av| 亚洲欧洲日本在线| 欧美搞黄网站| 欧美午夜片在线观看| 久久精品免费电影| 亚洲国产精品黑人久久久| 欧美日韩一区二区三区四区在线观看| 国产综合色精品一区二区三区| 亚洲性人人天天夜夜摸| 亚洲第一页自拍| av成人黄色| 欧美精品在欧美一区二区少妇| 久久亚洲电影| 欧美黄色一区二区| 欧美日产国产成人免费图片| 欧美久久久久久久久| 一区二区三区日韩在线观看| 国产一区二区三区高清在线观看| 欧美精品免费看| 欧美第一黄网免费网站| 国产精品综合不卡av| 亚洲日本aⅴ片在线观看香蕉| 两个人的视频www国产精品| 激情久久婷婷| 久久人人看视频| 久久综合色天天久久综合图片| 欧美黄色aaaa| 夜夜嗨av一区二区三区四季av| 在线日韩av| 欧美激情一区在线观看| 日韩一级精品视频在线观看| 欧美性大战久久久久久久蜜臀| 欧美日韩一区二区三区视频| 国产精品亚洲人在线观看| 亚洲经典在线看| 欧美日韩国产一区精品一区| 欧美亚洲在线观看| 久久久高清一区二区三区| 亚洲小说欧美另类社区| 欧美在线免费视频| 亚洲一级电影| 国产午夜精品麻豆| 欧美高清不卡| 亚洲影院免费观看| 亚洲黄色在线| 亚洲成色最大综合在线| 亚洲福利精品| 国产精品高潮呻吟视频| 亚洲第一精品电影| 久久丁香综合五月国产三级网站| 久久久之久亚州精品露出| 亚洲激情第一页| 欧美国产日本| 久久在精品线影院精品国产| 亚洲国产专区校园欧美| 久久精品综合网| 国产午夜一区二区三区| 亚洲第一中文字幕| 在线成人小视频| 欧美一级视频免费在线观看| 欧美国产一区二区三区激情无套| 99精品热视频只有精品10| 亚洲黄一区二区三区| 欧美日韩在线影院| 国产精品高潮在线| 久久乐国产精品| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲一区在线观看视频| 欧美成人中文| 国产一区二区三区日韩| 国产日韩欧美一区在线| 亚洲制服丝袜在线| 国产亚洲成av人在线观看导航| 国产精品自拍一区| 亚洲精品资源美女情侣酒店| 欧美激情乱人伦| 国产日韩综合| 欧美视频日韩视频在线观看| 在线成人av网站| 欧美影院在线播放| 99香蕉国产精品偷在线观看| 激情丁香综合| 国产一区二区三区高清| 亚洲激情在线视频| 欧美一区二区三区在线观看视频| 欧美 日韩 国产精品免费观看| 欧美人与禽猛交乱配视频| 99国产精品久久久久久久| 99视频精品在线| 一区二区三区四区国产| 国语对白精品一区二区| 亚洲高清在线精品| 欧美丰满高潮xxxx喷水动漫| 亚洲国产精品欧美一二99| 亚洲人成人一区二区在线观看| 久久久av水蜜桃| 国产精品一区久久| 久久国产精品99国产精| 国产精品女主播| 老司机精品导航| 99精品视频免费在线观看| 麻豆亚洲精品| 狠狠色丁香婷婷综合影院| 久久亚洲影音av资源网| 国产日韩精品一区二区三区| 老牛影视一区二区三区| 久久av一区| 国产精品日本欧美一区二区三区|