999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

用C語言實(shí)現(xiàn)類實(shí)例化的研究

2016-12-21 07:13:58

楊 韜

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

?

用C語言實(shí)現(xiàn)類實(shí)例化的研究

楊 韜

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

多年以來,C語言在嵌入式軟件開發(fā)中被廣泛使用,但由于開發(fā)人員和應(yīng)用場(chǎng)景等原因,面向?qū)ο蟆⒃O(shè)計(jì)模式等優(yōu)秀的軟件開發(fā)方法始終沒有很好地運(yùn)用起來。時(shí)至今日,物聯(lián)網(wǎng)等應(yīng)用的興起,給嵌入式軟件開發(fā)帶來新的挑戰(zhàn),而傳統(tǒng)的面向過程開發(fā)已經(jīng)難以支撐這些復(fù)雜的應(yīng)用。因此,有必要在嵌入式軟件開發(fā)中引入面向?qū)ο蟆⒃O(shè)計(jì)模式等優(yōu)秀的軟件開發(fā)方法。面向?qū)ο笫乾F(xiàn)代軟件方法的根基,面向?qū)ο篌w現(xiàn)在類上,使用類來創(chuàng)建對(duì)象的過程就是實(shí)例化。文章結(jié)合C語言的特性,對(duì)使用C語言實(shí)現(xiàn)類實(shí)例化進(jìn)行了討論。

C語言;面向?qū)ο螅活悾粚?shí)例化

0 引言

物聯(lián)網(wǎng)等應(yīng)用的興起,給嵌入式軟件開發(fā)帶來新的挑戰(zhàn),而傳統(tǒng)的面向過程開發(fā)已經(jīng)難以支撐這些復(fù)雜的應(yīng)用。因此,有必要在嵌入式軟件開發(fā)中引入面向?qū)ο蟆⒃O(shè)計(jì)模式等優(yōu)秀的軟件開發(fā)方法。本文討論了如何使用C語言來實(shí)現(xiàn)類的實(shí)例化。在C++等面向?qū)ο笳Z言中對(duì)類做了原生的支持,使用new這類關(guān)鍵字即可實(shí)例化一個(gè)對(duì)象。盡管C語言并不支持new,但是通過對(duì)實(shí)例化過程的分析和拆分,也能實(shí)現(xiàn)實(shí)例化。

1 基本概念[1]

1.1 類

面向?qū)ο笥蟹庋b、繼承、多態(tài)三大特性,這些特性主要通過類來體現(xiàn)。類就是一個(gè)封裝了屬性以及相關(guān)操作的代碼的邏輯實(shí)體。

類具有屬性,它是對(duì)象的狀態(tài)的抽象,用數(shù)據(jù)結(jié)構(gòu)來描述類的屬性。

類具有方法,它是對(duì)象的行為的抽象,用方法名和實(shí)現(xiàn)該操作的方法來描述。

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

類是抽象的數(shù)據(jù)類型,在內(nèi)存中并不存在(Python等動(dòng)態(tài)語言除外),只有類的實(shí)例存在于內(nèi)存中。

1.2 對(duì)象

對(duì)象是人們要進(jìn)行研究的任何事物,從最簡(jiǎn)單的整數(shù)到復(fù)雜的飛機(jī)等均可看作為對(duì)象,它不僅能表示具體的事物,還能表示抽象的規(guī)則、計(jì)劃或事件。

對(duì)象具有狀態(tài),一個(gè)對(duì)象用數(shù)據(jù)值來描述它的狀態(tài)。

對(duì)象還有操作,用于改變對(duì)象的狀態(tài),對(duì)象及其操作就是對(duì)象的行為。

對(duì)象實(shí)現(xiàn)了數(shù)據(jù)和操作的結(jié)合,使數(shù)據(jù)和操作封裝于對(duì)象的統(tǒng)一體中。

1.3 實(shí)例化

用類創(chuàng)建對(duì)象的過程就是實(shí)例化,創(chuàng)建的對(duì)象被稱為類的實(shí)例。實(shí)例化包含兩個(gè)步驟,第一步是分配對(duì)象的內(nèi)存,第二步是初始化對(duì)象的內(nèi)存。

2 類封裝的C語言實(shí)現(xiàn)

類的第一大特性為封裝,封裝即將對(duì)象的屬性和方法封裝在一起,在C語言中可以使用.C、.H和結(jié)構(gòu)體實(shí)現(xiàn)類的封裝特性。

圖1 Human類圖

以圖1中Human類為例,可以使用human.h、human.c、struct human三個(gè)元素來完成封裝,human.c為human.h中函數(shù)聲明的實(shí)現(xiàn),本文不討論這些細(xì)節(jié),所以只給出如下human.h的關(guān)鍵代碼片段:

typedef struct human {

const char *name;

int_money;

} human_t;

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

void human_talk (human_t *p_this, const char *p_words);

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

void human_deinit (human_t *p_this);

3 類實(shí)例化的C語言實(shí)現(xiàn)

實(shí)例化包含兩個(gè)步驟:分配對(duì)象的內(nèi)存和初始化對(duì)象的內(nèi)存。接下來本文以圖1中Human類的實(shí)例化為例,討論C語言如何實(shí)現(xiàn)類的實(shí)例化。

3.1 對(duì)象的內(nèi)存

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

#include "human.h"

struct human g_john;

/* 靜態(tài)變量 */

static struct human __g_john;

/* 靜態(tài)變量 */

void foo (void)

{

static struct human s_john;

/* 靜態(tài)變量 */

struct human john;

/* 棧變量 */

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

/* 動(dòng)態(tài)變量 */

}

站在內(nèi)存的角度,可以把類看做結(jié)構(gòu)體類型,類的實(shí)例就是結(jié)構(gòu)體變量,因此,對(duì)象也就有動(dòng)態(tài)對(duì)象、靜態(tài)對(duì)象和棧對(duì)象之分,它們之間的區(qū)別如表1所示。

表1 靜態(tài)對(duì)象、動(dòng)態(tài)對(duì)象和棧對(duì)象

對(duì)于嵌入式軟件中的C面向?qū)ο缶幊蹋浞掷斫獗?中的這三類對(duì)象是非常有必要的。大多數(shù)情況下,一個(gè)類都要能夠被實(shí)例化為靜態(tài)對(duì)象。

3.2 對(duì)象的初始化

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

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

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 實(shí)例化

前面兩小節(jié)分別討論了對(duì)象的內(nèi)存和對(duì)象的初始化,這兩步組成了實(shí)例化。下面的代碼展示了不同類型對(duì)象的實(shí)例化:

#include "human.h"

human_t g_john;

/* 靜態(tài)對(duì)象 */

static human_t __g_jen;

/* 靜態(tài)對(duì)象 */

void foo (void)

{

static human_t s_jack;

/* 靜態(tài)對(duì)象 */

human_t tom;

/* 棧對(duì)象 */

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

/* 動(dòng)態(tài)對(duì)象 */

// 實(shí)例化上面定義的靜態(tài)對(duì)象、動(dòng)態(tài)對(duì)象和棧對(duì)象

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 訪問對(duì)象

對(duì)象實(shí)例化后便存于內(nèi)存中,此時(shí)可以訪問對(duì)象的屬性和方法,下面的代碼展示了對(duì)象的訪問:

#include "human.h"

void foo (void)

{

human_t john;

/* 定義對(duì)象內(nèi)存 */

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

/* 初始化對(duì)象 */

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

/* 訪問對(duì)象的屬性 */

human_talk(p_john, "I am hungry");

/* 訪問對(duì)象的方法 */

human_deinit(&john)

/* 對(duì)象解初始化 */

}

3.5 銷毀對(duì)象

當(dāng)對(duì)象不再使用時(shí),便可銷毀之。銷毀對(duì)象與創(chuàng)建對(duì)象(實(shí)例化)的操作相反,首先對(duì)對(duì)象進(jìn)行解初始化操作,然后再釋放對(duì)象的內(nèi)存。

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

#include "human.h"

human_t g_john;

/* 靜態(tài)對(duì)象 */

static human_t __g_jen;

/* 靜態(tài)對(duì)象 */

void foo (void)

{

static human_t s_jack;

/* 靜態(tài)對(duì)象 */

human_t tom;

/* 棧對(duì)象 */

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

/* 動(dòng)態(tài)對(duì)象 */

// 實(shí)例化上面定義的靜態(tài)對(duì)象、動(dòng)態(tài)對(duì)象和棧對(duì)象

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);

/* 銷毀對(duì)象 */

human_deinit(p_john);

human_deinit(p_jen);

human_deinit(p_jack);

human_deinit(p_tom);

human_deinit(p_lee);

free(p_lee_mem);

/* 注意:需要用戶釋放動(dòng)態(tài)申請(qǐng)的對(duì)象內(nèi)存 */

}

4 結(jié)論

本文通過使用C語言實(shí)現(xiàn)Human類的實(shí)例化,討論了如何使用C語言來實(shí)現(xiàn)類的實(shí)例化。在C++等面向?qū)ο笳Z言中對(duì)類做了原生的支持,使用new這類關(guān)鍵字即可實(shí)例化一個(gè)對(duì)象。盡管C語言并不支持new,但是通過對(duì)實(shí)例化過程的分析和拆分,也能實(shí)現(xiàn)實(shí)例化。

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

Research on the implementation of class instantiation with C-language

Yang Tao

(Guangzhou Zhiyuan Electric Co. Ltd. , Guangzhou 510660, China)

Over the years, C-language is widely used in embedded software development, but because of developers and application scenarios and other reasons, object-oriented, design patterns and other outstanding software development methods have not been well used. Today, the rise of Internet of Things and other applications, has brought new challenges to the development of embedded software, and the traditional process-oriented development has been difficult to support these complex applications. Therefore, it is necessary to introduce object-oriented, design patterns and other excellent software development methods in embedded software development. Object oriented method is the foundation of modern software, object-oriented is embodied in the class. The process of using the class to create the object is instantiation. Combining with the characteristics of C language, the implementation of class instantiation by using C language is discussed.

C-language; object-oriented; class; instantiation

TP312

A

10.19358/j.issn.1674- 7720.2016.23.004

楊韜. 用C語言實(shí)現(xiàn)類實(shí)例化的研究[J].微型機(jī)與應(yīng)用,2016,35(23):15-17.

2016-09-20)

楊韜(1986-),男,學(xué)士,工程師,主要研究方向:嵌入式系統(tǒng)、軟件工程、軟件方法。

主站蜘蛛池模板: 精品久久香蕉国产线看观看gif| 91小视频在线| 亚洲aaa视频| 青草视频网站在线观看| 亚洲人在线| 欧美日韩国产精品综合| 91福利免费| 免费不卡在线观看av| 欧美视频在线第一页| 国产精品妖精视频| 国产成人禁片在线观看| 亚洲成人一区在线| 国产91全国探花系列在线播放| 国产97视频在线| 国产av一码二码三码无码| 国产v精品成人免费视频71pao| 亚洲丝袜第一页| 精品一区二区三区自慰喷水| 国产一级妓女av网站| 欧美国产菊爆免费观看| 2022精品国偷自产免费观看| 欧美成在线视频| 嫩草影院在线观看精品视频| 免费无码AV片在线观看国产| 国产三级a| 日韩av手机在线| 2020国产精品视频| 婷婷色婷婷| 免费一看一级毛片| 好吊日免费视频| 国产精品成| 激情综合网激情综合| 日韩激情成人| 亚洲第一在线播放| 久久精品亚洲热综合一区二区| 91久久国产综合精品| 日韩视频精品在线| 亚洲欧美另类专区| 极品国产在线| 国产在线观看精品| 午夜国产在线观看| 亚洲第一视频网| 九色综合伊人久久富二代| 欧美成人免费午夜全| 国产自在线拍| 久久精品中文字幕免费| 在线观看91精品国产剧情免费| 中文字幕亚洲专区第19页| 久久黄色一级视频| 亚洲av色吊丝无码| 亚洲无码视频图片| 国产精品第页| 国产真实乱人视频| 天天色天天操综合网| 国产精品99在线观看| 欧美精品成人一区二区视频一| 尤物精品视频一区二区三区| 尤物特级无码毛片免费| 亚洲成A人V欧美综合天堂| 亚洲精品无码av中文字幕| 99久久性生片| 欧美综合区自拍亚洲综合天堂| 欧美97色| 四虎影视库国产精品一区| 亚洲中文无码av永久伊人| 亚洲国产日韩视频观看| 夜精品a一区二区三区| 一区二区三区精品视频在线观看| 国产精品区视频中文字幕| 69视频国产| 在线欧美一区| 亚洲日韩精品无码专区97| 欧美日韩专区| 91久久精品国产| 99久久国产自偷自偷免费一区| 一区二区欧美日韩高清免费| 久久激情影院| 3344在线观看无码| 毛片网站观看| 乱系列中文字幕在线视频| 亚洲浓毛av| 亚洲第一视频网|