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

  楊韜

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

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

  關鍵詞: C語言;面向對象;類;實例化

  中圖分類號:TP312文獻標識碼:ADOI:10.19358/j.issn.16747720.2016.23.004

  引用格式:楊韜. 用C語言實現類實例化的研究[J].微型機與應用,2016,35(23):15-17.

0引言

  物聯網等應用的興起,給嵌入式軟件開發帶來新的挑戰,而傳統的面向過程開發已經難以支撐這些復雜的應用。因此,有必要在嵌入式軟件開發中引入面向對象、設計模式等優秀的軟件開發方法。本文討論了如何使用C語言來實現類的實例化。在C++等面向對象語言中對類做了原生的支持,使用new這類關鍵字即可實例化一個對象。盡管C語言并不支持new,但是通過對實例化過程的分析和拆分,也能實現實例化。

1基本概念[1]

  1.1類

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

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

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

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

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

  1.2對象

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

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

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

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

  1.3實例化

  用類創建對象的過程就是實例化,創建的對象被稱為類的實例。實例化包含兩個步驟,第一步是分配對象的內存,第二步是初始化對象的內存。

2類封裝的C語言實現

  類的第一大特性為封裝,封裝即將對象的屬性和方法封裝在一起,在C語言中可以使用.C、.H和結構體實現類的封裝特性。

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

圖像 001.png

  typedef struct human {

  const char *name;

  int_money;

  } human_t;

  human_t *human_init (human_t *p_this, const char *name, int money);

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

  voidhuman_buy (human_t *p_this, const char *p_something, unsigned price, unsigned count);

  voidhuman_deinit (human_t *p_this);

3類實例化的C語言實現

  實例化包含兩個步驟:分配對象的內存和初始化對象的內存。接下來本文以圖1中Human類的實例化為例,討論C語言如何實現類的實例化。

  3.1對象的內存

  如果把類看做類型,那么類的實例就是變量,既然是變量,那么就有動態變量、靜態變量和棧變量之分。在C語言中,使用malloc()這類動態內存分配函數得到的變量就是動態變量;全局變量和加了static關鍵字的變量就是靜態變量;在函數內創建的局部變量就是棧變量。下面的代碼展示了C語言中的這幾類變量:

  #include "human.h"

  struct humang_john;/* 靜態變量 */

  static struct human __g_john;/* 靜態變量 */

  void foo (void)

  {

  static struct human s_john;/* 靜態變量 */

  struct human john;/* 棧變量 */

  struct human*p_john = malloc(sizeof(*p_john));

  /* 動態變量 */

  }

  站在內存的角度,可以把類看做結構體類型,類的實例就是結構體變量,因此,對象也就有動態對象、靜態對象和棧對象之分,它們之間的區別如表1所示。

圖像 002.png

  free()

  釋放內存內存分配可能失敗,花費的時間可能不確定;需要處理內存分配失敗的情況,增加程序的復雜性可以在需要時創建和銷毀對象靜態對象位于.data、

  .bss內存段需要編譯時確定對象的數量;一直占用內存;對象數量太多太大時會影響程序啟動時間確定性好,只要程序能夠運行起來,就一定能夠創建成功棧對象位于系統

  棧、對象棧對象太大會導致棧溢出自動完成對象內存的分配和回收

  對于嵌入式軟件中的C面向對象編程,充分理解表1中的這三類對象是非常有必要的。大多數情況下,一個類都要能夠被實例化為靜態對象。

  3.2對象的初始化

  初始化對象就是初始化對象的內存,在初始化之前,必然要先得到對象的內存(上一小節已討論),但無論對象的內存是何種類型,初始化的操作都是相同的。在JAVA等編程語言中,完成此操作的函數被稱作構造函數,使用C語言來實現就是一個名為xxxx_init()的初始化函數,也可稱之為構造函數。

  以Human類為例,它的初始化函數human_init()如下面的代碼所示,可留意到對象的內存需要顯式傳遞給它。

  human_t *human_init (human_t *p_this, const char *name, int money)

  {

  p_this->name = name;

  p_this->_money = money;

  return p_this;

  }

  3.3實例化

  前面兩小節分別討論了對象的內存和對象的初始化,這兩步組成了實例化。下面的代碼展示了不同類型對象的實例化:

  #include "human.h"

  human_tg_john;/* 靜態對象 */

  statichuman_t__g_jen;/* 靜態對象 */

  void foo (void)

  {

  static human_ts_jack;/* 靜態對象 */

  human_t tom;/* 棧對象 */

  human_t*p_lee_mem= malloc(sizeof(*p_lee_mem));

  /* 動態對象 */

  // 實例化上面定義的靜態對象、動態對象和棧對象

  human_t *p_john= human_init(&g_john, "john", 100);

  human_t *p_jen = human_init(&__g_jen, "jen", 100);

  human_t *p_jack = human_init(&s_jack, "jack", 100);

  human_t *p_tom = human_init(&tom, "tom", 100);

  human_t *p_lee = human_init(p_lee_mem, "lee", 100);

  3.4訪問對象

  對象實例化后便存于內存中,此時可以訪問對象的屬性和方法,下面的代碼展示了對象的訪問:

  #include "human.h"

  void foo (void)

  {

  human_t john;/* 定義對象內存 */

  p_john = human_init(&jhon, "John", 100);

  /* 初始化對象 */

  printf("Human %s is born!", p_john->name);

  /* 訪問對象的屬性 */

  human_talk(p_john, "I am hungry");

  /* 訪問對象的方法 */

  human_deinit(&john)/* 對象解初始化 */

  }

  3.5銷毀對象

  當對象不再使用時,便可銷毀之。銷毀對象與創建對象(實例化)的操作相反,首先對對象進行解初始化操作,然后再釋放對象的內存。

  以Human類為例,首先調用human_deinit()完成對象的解初始化,接下來,如果是靜態對象或棧對象就不用顯式釋放對象的內存,因為靜態對象或棧對象有確定的生命周期;如果是調用malloc()等函數得到了動態對象,則必須調用free()等對應的函數釋放對象的內存。下面的代碼展示了各種對象的銷毀:

  #include "human.h"

  human_tg_john;/* 靜態對象 */

  statichuman_t__g_jen;/* 靜態對象 */

  void foo (void)

  {

  static human_ts_jack;/* 靜態對象 */

  human_t tom;/* 棧對象 */

  human_t*p_lee_mem= malloc(sizeof(*p_lee_mem));

  /* 動態對象 */

  // 實例化上面定義的靜態對象、動態對象和棧對象

  human_t *p_john = human_init(&g_john, "john", 100);

  human_t *p_jen = human_init(&__g_jen, "jen", 100);

  human_t *p_jack = human_init(&s_jack, "jack", 100);

  human_t *p_tom = human_init(&tom, "tom", 100);

  human_t *p_lee = human_init(p_lee_mem, "lee", 100);

  /* 銷毀對象 */

  human_deinit(p_john);

  human_deinit(p_jen);

  human_deinit(p_jack);

  human_deinit(p_tom);

  human_deinit(p_lee);

  free(p_lee_mem);

  /* 注意:需要用戶釋放動態申請的對象內存 */

  }

4結論

  本文通過使用C語言實現Human類的實例化,討論了如何使用C語言來實現類的實例化。在C++等面向對象語言中對類做了原生的支持,使用new這類關鍵字即可實例化一個對象。盡管C語言并不支持new,但是通過對實例化過程的分析和拆分,也能實現實例化。

  參考文獻

  [1] 百度. 百度百科/面向對象[EB/OL].(2016-08-08).http://baike.baidu.com/link?url=6XlXEOSlrKn87S7SJv4 UWSX7EjstoDVm wJ13OAod XUrUrnZkVg3ntPFir Ey5c6mqOb ZZOevQI6K3Ungq1Mq.



此內容為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>
          欧美午夜免费电影| 亚洲天堂av在线免费| 美女诱惑一区| 国产精品成人av性教育| 亚洲欧美激情一区| 欧美日韩综合视频| 久久精品日产第一区二区| 久久久激情视频| 另类酷文…触手系列精品集v1小说| 久久久综合精品| 中国成人亚色综合网站| 黄色日韩网站| 夜夜躁日日躁狠狠久久88av| 久久久亚洲精品一区二区三区| 久久精品一区蜜桃臀影院| 9l视频自拍蝌蚪9l视频成人| 裸体女人亚洲精品一区| 亚洲乱码久久| 国产精品亚洲一区| 国语自产精品视频在线看抢先版结局| 欧美三级视频在线| 黄色综合网站| 欧美片在线播放| 亚洲欧美欧美一区二区三区| 久久久亚洲高清| 久久青草久久| 亚洲国产欧美国产综合一区| 亚洲国产人成综合网站| 在线观看日韩专区| 国产精品视频第一区| 久久一区二区视频| 欧美天天影院| 国产日韩精品久久久| 国产一区二区三区四区三区四| 亚洲一区视频在线观看视频| 女生裸体视频一区二区三区| 麻豆亚洲精品| 在线成人激情黄色| 亚洲男人av电影| 国产精品久久国产愉拍| 欧美专区日韩视频| 一区二区三区三区在线| 国内外成人免费视频| 午夜激情久久久| 亚洲国产精品久久久久秋霞影院| 欧美专区在线观看一区| 亚洲精品一区二区三区婷婷月| 精品91免费| 久久久精品动漫| 91久久亚洲| 伊甸园精品99久久久久久| 亚洲免费视频在线观看| 午夜精品久久久久久久久久久| 欧美一级日韩一级| 欧美午夜一区二区| 亚洲线精品一区二区三区八戒| 亚洲韩国日本中文字幕| 亚洲图片欧美日产| 亚洲国产综合91精品麻豆| 国产精品性做久久久久久| 欧美va亚洲va香蕉在线| 韩国欧美国产1区| 欧美成人高清| 性色av一区二区三区红粉影视| 久久五月天婷婷| 欧美激情国产精品| 亚洲一区中文| 亚洲午夜精品久久久久久浪潮| 亚洲最新色图| 欧美久久久久久蜜桃| 欧美国产激情| 在线成人国产| 黄色成人免费网站| 在线精品亚洲一区二区| 狠狠网亚洲精品| 欧美经典一区二区三区| 久久最新视频| 国产精品亚洲成人| 亚洲黄色一区二区三区| 国产日韩一级二级三级| 久久久国产亚洲精品| 亚洲三级毛片| 午夜精品久久久久久久99樱桃| 亚洲免费黄色| 国产日韩欧美精品| 欧美三级小说| 欧美一区在线看| 国内精品美女在线观看| 亚洲精品婷婷| 久久午夜电影网| 国产噜噜噜噜噜久久久久久久久| 一区二区三区四区精品| 亚洲精品国产日韩| 免费成年人欧美视频| 欧美日韩亚洲国产精品| 国产精品一区二区在线观看网站| 国产精品毛片高清在线完整版| 国产精品视频免费一区| 国产一区二区无遮挡| 亚洲精品免费电影| 亚洲欧美日韩成人| 欧美乱妇高清无乱码| 国产欧美在线播放| 亚洲精品一区二区三区不| 欧美日韩综合在线免费观看| 国产一区在线播放| 国产精品国内视频| 在线国产精品播放| 亚洲精品小视频| 一区二区在线不卡| 国产精品免费区二区三区观看| 欧美少妇一区| 欧美日韩国产精品成人| 国产一区二区精品| 国产精品视频yy9099| 国产精品久久午夜| 永久91嫩草亚洲精品人人| 亚洲成色最大综合在线| 久久午夜视频| 国产精品免费一区二区三区在线观看| 99人久久精品视频最新地址| 免费成年人欧美视频| 久久久久在线| 激情视频亚洲| 国产亚洲高清视频| 亚洲国产精品热久久| 亚洲天堂av高清| 国产亚洲精品激情久久| 亚洲精品国精品久久99热一| 久久综合伊人77777蜜臀| 牛牛国产精品| 日韩亚洲一区二区| 夜夜狂射影院欧美极品| 亚洲精品欧洲精品| 久久久噜噜噜久久人人看| 亚洲午夜激情免费视频| 欧美精品v国产精品v日韩精品| 久久久精品动漫| 亚洲承认在线| 99人久久精品视频最新地址| 久久久久网站| 国产区精品在线观看| 久久国产精品免费一区| 久久综合网色—综合色88| 欧美亚洲日本国产| 国内成+人亚洲+欧美+综合在线| 亚洲一区二区三区四区视频| 一本久道久久久| 亚洲国产欧美一区二区三区同亚洲| 久久久久久久久久久久久久一区| 欧美jizz19性欧美| 亚洲一级黄色片| 欧美一级专区免费大片| 久久se精品一区二区| 欧美日韩免费观看一区=区三区| 中文精品在线| 久久精品99无色码中文字幕| 国产精品久久久久免费a∨大胸| 欧美激情一区二区三区在线视频| 性欧美精品高清| 亚洲精品免费在线| 欧美日韩国产综合视频在线观看中文| 欧美日韩视频在线一区二区观看视频| 国产亚洲欧美日韩在线一区| 国产日本欧美在线观看| 亚洲精选91| 日韩亚洲欧美高清| 欧美深夜影院| 免费不卡中文字幕视频| 激情成人av在线| 国产伦精品一区| 久久免费视频一区| 久久精品国产亚洲a| 国产精品日韩欧美一区二区三区| 欧美激情中文不卡| 亚洲精品资源美女情侣酒店| 久久视频在线视频| 欧美午夜精品久久久久久孕妇| 亚洲国产精品va在线看黑人| 久久网站热最新地址| 亚洲黄一区二区三区| 亚洲激情综合| 久久国产精品一区二区三区四区| 久久精品一本| 久久影音先锋| 国内精品国语自产拍在线观看| 国产人妖伪娘一区91| 欧美福利视频| 欧美大片免费久久精品三p| 亚洲一区二区三区777| 一色屋精品视频在线观看网站| 亚洲狠狠丁香婷婷综合久久久| 亚洲电影免费| 在线亚洲免费| 欧美日韩一区自拍| 1769国产精品| 欧美精品一区二区久久婷婷| 亚洲国产另类精品专区| 狠狠综合久久av一区二区老牛| 免费在线观看日韩欧美| 午夜日韩视频| 国产美女在线精品免费观看| 亚洲综合好骚| 久久久精品日韩欧美| 极品少妇一区二区三区精品视频| 久久久久成人精品免费播放动漫| 亚洲小说春色综合另类电影| 国产欧美日韩视频一区二区三区| 欧美在线视频播放| 国产一区二区三区最好精华液| 欧美日韩久久| 性做久久久久久免费观看欧美| 久久久国产午夜精品| 亚洲另类黄色| 亚洲免费网址| 国外视频精品毛片| 欧美激情一区二区三区全黄| 欧美视频精品在线| 久久九九电影| 欧美亚洲在线| 久久精品日产第一区二区三区| 亚洲国产合集| 国内视频精品| 蜜桃av噜噜一区二区三区| 在线播放视频一区| 欧美电影免费观看大全| 久久久久久亚洲精品杨幂换脸| 中文日韩在线视频| 欧美日韩国产限制| 欧美二区视频| 亚洲区在线播放| 久久都是精品| 国产午夜精品全部视频在线播放| 在线看片第一页欧美| 久久精品国产视频| 国产精品亚洲第一区在线暖暖韩国| 欧美伦理在线观看| 国产偷国产偷亚洲高清97cao| 国产欧美不卡| 久久成人免费电影| 久久综合电影一区| 久久精品国产99精品国产亚洲性色| 亚洲级视频在线观看免费1级| 欧美成人精品h版在线观看| 一区在线视频| 亚洲一区欧美一区| 亚洲人成网站999久久久综合| 日韩午夜在线观看视频| 国产欧美精品xxxx另类| 国产中文一区| 国内视频一区| 日韩午夜高潮| 日韩小视频在线观看专区| 国产精品乱码一区二三区小蝌蚪| 国产婷婷精品| 国产精品素人视频| 欧美日本国产一区| 欧美三级资源在线| 亚洲欧美制服中文字幕| 国产一区二区三区丝袜| 亚洲精品一区二区三区不| 亚洲伊人伊色伊影伊综合网| 久久九九免费视频| 在线中文字幕一区| 久久久一区二区三区| 亚洲午夜视频在线观看| 99re热这里只有精品免费视频| 在线激情影院一区| 欧美午夜激情小视频| 亚洲国产精品一区制服丝袜| 欧美日韩国产123| 亚洲高清三级视频| 一区二区国产日产| 午夜伦欧美伦电影理论片| 老鸭窝亚洲一区二区三区| 夜夜嗨av一区二区三区四区| 国产精品成人免费精品自在线观看| 国产精品福利网| 亚洲免费在线精品一区| 亚洲成人在线网站| 免费不卡在线观看| 久久婷婷久久| 亚洲精品午夜| 国产精品初高中精品久久| 国产精品电影在线观看| 久久国产精品网站| 免播放器亚洲一区| 亚洲精品一区久久久久久| 亚洲综合第一| 亚洲精品乱码久久久久久蜜桃91| 国产乱码精品一区二区三区av| 亚洲国产成人精品女人久久久| 夜夜嗨av一区二区三区| 亚洲一区二区黄色| 欧美sm视频| 欧美成人一区二区三区在线观看| 在线看国产一区| 国产精品成人一区二区三区吃奶| 一区二区三区四区五区在线| 欧美国产精品人人做人人爱| 在线观看免费视频综合| 精品动漫3d一区二区三区免费| 国产精品视频你懂的| 亚洲精品美女久久7777777| 欧美美女操人视频| 国产午夜精品一区二区三区欧美| 一区二区三区|亚洲午夜| 国产欧美精品在线播放| 欧美大片免费观看| 亚洲精品一级| 免费在线观看日韩欧美| 国产精品高清免费在线观看| 欧美啪啪一区| 亚洲一区中文字幕在线观看| 久久久久久亚洲精品杨幂换脸| 蜜桃视频一区| 欧美午夜寂寞影院| 欧美**人妖| 国产日韩一区二区三区在线播放| 西西裸体人体做爰大胆久久久| 久久精品日韩一区二区三区| 正在播放欧美一区| 国外成人性视频| 99这里只有精品| 欧美一区三区三区高中清蜜桃| 国内精品久久久久久久97牛牛| 亚洲国产成人久久综合| 国产一区二区三区精品欧美日韩一区二区三区|