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

從C結(jié)構(gòu)串到C++類串

2008-12-31 00:00:00
計(jì)算機(jī)教育 2008年13期

本文以C為元語言,C++為對(duì)象語言,以C++類串中的構(gòu)造函數(shù)、析構(gòu)函數(shù)、賦值函數(shù)和成員轉(zhuǎn)換函數(shù)等概念為例,用C程序描述它們的產(chǎn)生過程,進(jìn)而用C程序描述C++程序。

1構(gòu)造函數(shù)和析構(gòu)函數(shù)

(1) 從C的構(gòu)造函數(shù)SetString到C++的轉(zhuǎn)換缺省構(gòu)造函數(shù)的過程是,將指針參量s改名為this后隱藏,給參數(shù)c加上缺省值,去掉返回值類型說明。[2]

構(gòu)造函數(shù)實(shí)質(zhì)上是初始化語言的推廣,經(jīng)過C描述的結(jié)構(gòu),到C++階段達(dá)到了和語言內(nèi)部類型的初始化語句統(tǒng)一的形式。例如:

String S(\"ok\");

等價(jià)于

String S=\"ok\";

和語言內(nèi)部類型變量的初始化語句的形式統(tǒng)一,例如:

float f=5;

給用戶定義的類的對(duì)象初始化,一般不僅需要傳遞初始值,還要定義初始化過程,特別是當(dāng)這個(gè)類含有指針成員的時(shí)候,所以構(gòu)造函數(shù)保留了參數(shù)表和函數(shù)體。之所以去掉返回值類型說明,是因?yàn)槌跏蓟^程是在構(gòu)造函數(shù)體內(nèi)完成的,不是由構(gòu)造函數(shù)的返回值完成的。

語言內(nèi)部類型變量還有復(fù)制初始化語句:

float f=5;

float g=f;

所以用戶類型,特別是含有指針成員的類型,需要增加復(fù)制構(gòu)造函數(shù):

String::String(const String cs); //復(fù)制構(gòu)造函數(shù)

應(yīng)用舉例:

String S=\"ok\";

String T(S);

等價(jià)于

String T=S;

相應(yīng)的,語言內(nèi)部類型也增加了等價(jià)的初始化語句形式:

float f(5);//float f= 5;

float g(f);//float g=f;

復(fù)制構(gòu)造函數(shù)調(diào)用語句所具有的初始化賦值形式?jīng)Q定了其參數(shù)應(yīng)該是引用型。[2]

(2) 對(duì)語言內(nèi)置類型之間的轉(zhuǎn)換,編譯器自有轉(zhuǎn)換機(jī)制,依據(jù)“升格”原則自動(dòng)轉(zhuǎn)換。例如實(shí)行下面的語句

float f=5;

就是自動(dòng)轉(zhuǎn)換,把整數(shù)5轉(zhuǎn)換為單浮點(diǎn)型賦給f。

但是用戶類型之間的轉(zhuǎn)換,用戶類型和內(nèi)置類型之間的轉(zhuǎn)換,需要用戶定義轉(zhuǎn)換函數(shù)。編譯器遇到非內(nèi)置類型之間的轉(zhuǎn)換,就會(huì)去尋找相應(yīng)的轉(zhuǎn)換函數(shù)。當(dāng)構(gòu)造函數(shù)僅有一個(gè)參數(shù),或僅有第一個(gè)參數(shù)沒有默認(rèn)值,而且這個(gè)參數(shù)是不同于該類的另一種數(shù)據(jù)類型,這個(gè)構(gòu)造函數(shù)就叫轉(zhuǎn)換構(gòu)造函數(shù)。因此,串類的缺省構(gòu)造函數(shù)

String(const char *c=\"\");

也是轉(zhuǎn)換構(gòu)造函數(shù)。實(shí)行下面的語句

String S=\"ok\";//String S(\"ok\");

就需要隱式調(diào)用轉(zhuǎn)換構(gòu)造函數(shù),我們稱之為隱式轉(zhuǎn)換。

這種隱式轉(zhuǎn)換經(jīng)常發(fā)生在函數(shù)調(diào)用中,如表2所示。

也有這樣的時(shí)候,一個(gè)類不允許隱式調(diào)用轉(zhuǎn)換構(gòu)造函數(shù),這就要在轉(zhuǎn)換構(gòu)造函數(shù)聲明前加關(guān)鍵字explicit,即顯式調(diào)用轉(zhuǎn)換構(gòu)造函數(shù):

String S=String(\"ok\"); //顯式調(diào)用轉(zhuǎn)換構(gòu)造函數(shù)

String S=(String) \"ok\"; //顯式調(diào)用轉(zhuǎn)換構(gòu)造函數(shù)

表2中的調(diào)用語句

func1(\"ok\");

要改進(jìn)為:

func1(String(\"ok\"));//或func1((String) \"ok\");

以前我們是這樣解釋return語句的:假設(shè)函數(shù)返回值類型是類串,那么

return(\"ok\");

相當(dāng)于

String _temp=\"ok\";//系統(tǒng)根據(jù)返回值類型創(chuàng)建一個(gè)臨時(shí)變量

但是有了explicit修飾符,這樣的解釋就不夠了。這需要隱式類型轉(zhuǎn)換,而如果串類的轉(zhuǎn)換構(gòu)造函數(shù)有explicit修飾,這就是非法的。因此對(duì)含有用戶類型的調(diào)用,需要重新解釋return的內(nèi)部實(shí)現(xiàn)過程如下:

String _temp=String(\"ok\");//顯式調(diào)用轉(zhuǎn)換構(gòu)造函數(shù)

類似的形式還有:

String T=String(S);//顯式調(diào)用拷貝構(gòu)造函數(shù)

相應(yīng)的,對(duì)語言固有類型也需要引入相應(yīng)的初始化形式,以達(dá)到統(tǒng)一。例如

float _temp=int(5);

float g=float(f);

(3) 在C++中,析構(gòu)函數(shù)是構(gòu)造函數(shù)的逆運(yùn)算,名稱是構(gòu)造函數(shù)名前加“~”,如~String。結(jié)束生命周期時(shí),系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)。一個(gè)類,若含指針成員,且指向動(dòng)態(tài)空間,則必須創(chuàng)建析構(gòu)函數(shù)。

運(yùn)算符new在隱含調(diào)用構(gòu)造函數(shù)時(shí)需要傳遞的參數(shù)在其后加括號(hào)給出。

String *pS;

pS=new String(\"ok\");

運(yùn)算符delete與free的主要區(qū)別是,前者在釋放pS指向的空間之前,負(fù)責(zé)調(diào)用析構(gòu)函數(shù)。

2成員賦值運(yùn)算符函數(shù)

一個(gè)C結(jié)構(gòu)串或C串,不能通過賦值運(yùn)算符“=”,只能通過賦值函數(shù)給另一個(gè)結(jié)構(gòu)串賦值,原因是結(jié)構(gòu)串含有指針成員。現(xiàn)在C++允許把成員賦值函數(shù)擴(kuò)展為成員賦值運(yùn)算符函數(shù)operator=,使賦值函數(shù)形式與賦值運(yùn)算符形式等價(jià)。

C++串類的應(yīng)用舉例:

String S,T,Y,W;

W=\"work\";//W.operator=(\"work\");

Y=W;//Y.operator=(W);

S=T=Y;//S.operator=(T.operator=(Y));

(S=T)=Y;//(S.operator=(T)).operator=(Y);

(S=\"hard\")=Y;//(S.operator=(\"hard\")).operator=(Y);

對(duì)應(yīng)的C串結(jié)構(gòu)應(yīng)用舉例:

String S,T,Y,W;

SetString(S,\"\"), SetString(T,\"\"), SetString(Y,\"\"), SetString(W,\"\");

CStrAssign(S,\"work\");

StrAssign(Y,W);

StrAssign(S,StrAssign(T,Y);

StrAssign(StrAssign(S,T),Y);

StrAssign(CStrAssign(S,\"hard\"),Y);

(1) 復(fù)制賦值運(yùn)算符函數(shù)和轉(zhuǎn)換賦值運(yùn)算符函數(shù)有區(qū)別:前者是用一個(gè)類串修改另一個(gè)類串;后者是用一個(gè)C串修改一個(gè)類串:

String S,T,W (\"work\");

S=W;//調(diào)用拷貝賦值運(yùn)算符函數(shù)

T=\"work\";//調(diào)用轉(zhuǎn)換賦值運(yùn)算符函數(shù)

(2) 賦值運(yùn)算符函數(shù)與構(gòu)造函數(shù)有區(qū)別:前者是用一個(gè)已存在的串修改另一個(gè)已存在的串,而且有返回值;后者是用一個(gè)已存在的串創(chuàng)建一個(gè)串:

String T=\"study\", W=\"work\";//調(diào)用缺省構(gòu)造函數(shù),用C串創(chuàng)建類串

String S=W;//調(diào)用拷貝構(gòu)造函數(shù),用類串創(chuàng)建類串

T=W;//調(diào)用拷貝賦值運(yùn)算符函數(shù),用類串修改類串

T=\"work\";//調(diào)用轉(zhuǎn)換賦值運(yùn)算符函數(shù),用C串修改類串

(3) 如果沒有轉(zhuǎn)換賦值運(yùn)算符函數(shù),那么C++編譯器會(huì)通過轉(zhuǎn)換構(gòu)造函數(shù)和拷貝賦值運(yùn)算符函數(shù)聯(lián)合實(shí)現(xiàn)其功能:先調(diào)用轉(zhuǎn)換構(gòu)造函數(shù),生成臨時(shí)匿名對(duì)象,再調(diào)用拷貝賦值運(yùn)算符函數(shù),將臨時(shí)對(duì)象賦值。例如:

T=\"work\";

C++編譯器將其轉(zhuǎn)換為:

T.operator=String(\"work\");

String _temp=\"work\";//調(diào)用轉(zhuǎn)換構(gòu)造函數(shù),生成臨時(shí)匿名對(duì)象,假設(shè)為temp

T=_temp;//調(diào)用拷貝賦值運(yùn)算符函數(shù),用臨時(shí)對(duì)象賦值

概括起來:

轉(zhuǎn)換賦值運(yùn)算符函數(shù)=轉(zhuǎn)換構(gòu)造函數(shù)+賦制賦值運(yùn)算符函數(shù)

3成員轉(zhuǎn)換函數(shù)

與轉(zhuǎn)換構(gòu)造函數(shù)和轉(zhuǎn)換賦值函數(shù)的轉(zhuǎn)換方向相反,C++成員轉(zhuǎn)換函數(shù)把類對(duì)象轉(zhuǎn)換為他類對(duì)象(見表5)。

應(yīng)用舉例:

String S(\"work\"),T(\"hard\");

char *c1=S;//char* c1=S.operator char*();

char *c2=(char*)S;//char* c2=S.operator char*();

c1=T; //c1=T.operator char*();

c2=(char*)T;//c2=T.operator char*();

4結(jié)束語

把C作為C++的元語言,這時(shí)C++的概念就可以用C程序嚴(yán)格地描述,避免C++解釋中的歧義性和模糊性,有利于理解;而且對(duì)C++,我們就不必從開頭講起,可以直接講授C++相對(duì)C的修正和補(bǔ)充部分,有利于深入。另外,C++的新標(biāo)準(zhǔn)包含數(shù)據(jù)結(jié)構(gòu),說明C++和數(shù)據(jù)結(jié)構(gòu)是一個(gè)整體,而C語言作為元語言,其教學(xué)內(nèi)容也應(yīng)該包含數(shù)據(jù)結(jié)構(gòu),但是包含多少為宜,根據(jù)Occam原理“每一個(gè)公理系統(tǒng)都是可以改進(jìn)的,但改進(jìn)不能超過其必要性?!盵1]還有許多需要我們大家共同研究的地方。

參考文獻(xiàn):

[1] 李未. 數(shù)理邏輯[M]. 北京:科學(xué)出版社,2008. 21.

[2] 王立柱. C/C++與數(shù)據(jù)結(jié)構(gòu)(第3版)(上冊(cè))[M]. 北京:清華大學(xué)出版社, 2008.221,214.

主站蜘蛛池模板: 久爱午夜精品免费视频| 国产精品手机视频一区二区| 极品国产在线| 制服丝袜亚洲| 天堂在线亚洲| 亚洲无码电影| 国产Av无码精品色午夜| 国产精品成人观看视频国产| 青草精品视频| 亚洲精品色AV无码看| 国产在线八区| 国产欧美亚洲精品第3页在线| 亚洲欧美日韩精品专区| 无码AV动漫| 精品撒尿视频一区二区三区| 欧美福利在线| 免费看一级毛片波多结衣| 国产精品无码久久久久久| 亚洲自拍另类| 色综合激情网| 亚洲欧美日本国产综合在线| 日韩小视频网站hq| 亚洲a级毛片| 一区二区三区国产精品视频| 国产极品美女在线| 国产91高清视频| 99久久精品免费视频| 91精品国产麻豆国产自产在线| 国产精鲁鲁网在线视频| 成人a免费α片在线视频网站| 在线视频一区二区三区不卡| 中文字幕无线码一区| 久久久久久久97| 欧美成人午夜影院| 香蕉久久国产超碰青草| 嫩草在线视频| 久草视频一区| 午夜国产理论| 另类专区亚洲| 99久久国产自偷自偷免费一区| 国产一级裸网站| 精品国产免费观看一区| 精品伊人久久久大香线蕉欧美| 米奇精品一区二区三区| 国产麻豆91网在线看| 国产一级毛片网站| 中文字幕在线视频免费| 亚洲日韩Av中文字幕无码| 国产精品99久久久久久董美香| 亚洲日本中文字幕天堂网| 黄色网址免费在线| 亚洲人成色77777在线观看| 伊人91视频| 色国产视频| 欧美日韩免费观看| 国产精品尤物铁牛tv | 一本无码在线观看| 国产一区二区精品福利| 国产91小视频在线观看| 久久黄色毛片| 色一情一乱一伦一区二区三区小说| 麻豆AV网站免费进入| 超薄丝袜足j国产在线视频| 国产高清又黄又嫩的免费视频网站| 久久精品免费看一| 国产麻豆aⅴ精品无码| 国产JIZzJIzz视频全部免费| 国产毛片片精品天天看视频| 亚洲有码在线播放| 成年女人a毛片免费视频| 一级毛片在线播放免费观看| 另类欧美日韩| 国产免费黄| 成人久久18免费网站| 最新痴汉在线无码AV| 国产精品自在在线午夜| 欧美中文字幕在线二区| 国产精品久久国产精麻豆99网站| 国产精品专区第一页在线观看| 欧美国产综合视频| 欧美在线伊人| 精品人妻系列无码专区久久|