最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++類的隱式轉(zhuǎn)換與強(qiáng)制轉(zhuǎn)換重載詳解

 更新時(shí)間:2013年09月12日 10:35:42   作者:  
轉(zhuǎn)換函數(shù)的名稱是類型轉(zhuǎn)換的目標(biāo)類型,因此,不必再為它指定返回值類型;轉(zhuǎn)換函數(shù)是被用于本類型的數(shù)值或變量轉(zhuǎn)換為其他的類型,也不必帶參數(shù)

在寫這篇文章之前,讓我們先回顧一下編譯器通過(guò)匹配過(guò)程確定調(diào)用哪一個(gè)函數(shù)的匹配順序:
(1)尋找和使用最符合函數(shù)名和參數(shù)類型(包括返回值)的函數(shù),若找到則調(diào)用;

(2)否則,尋找一個(gè)函數(shù)模板,將其實(shí)例化產(chǎn)生一個(gè)匹配的重載函數(shù),若找到則調(diào)用;

(3)否則,尋找可以通過(guò)類型轉(zhuǎn)換進(jìn)行參數(shù)匹配的重載函數(shù),若找到則調(diào)用它。

如果以上步驟均未找到匹配函數(shù),則這個(gè)調(diào)用是錯(cuò)誤的;如果這個(gè)調(diào)用有多于一個(gè)的匹配選譯,則調(diào)用匹配出現(xiàn)二義性,也是錯(cuò)誤的。
 
類型轉(zhuǎn)換是將一種類型的值映射為另一種類型的值。類型轉(zhuǎn)換實(shí)際上包含有自動(dòng)隱含和強(qiáng)制的兩種。

C語(yǔ)言編譯系統(tǒng)提供的內(nèi)部數(shù)據(jù)類型的自動(dòng)隱式轉(zhuǎn)換規(guī)則如下:

1.程序在執(zhí)行算術(shù)運(yùn)算時(shí),低類型可以轉(zhuǎn)換為高類型。

2.在賦值表達(dá)式中,右邊表達(dá)式的值自動(dòng)隱式轉(zhuǎn)換為左邊變量的類型,并賦值給它。

3.當(dāng)在函數(shù)調(diào)用時(shí),將實(shí)參值賦給形參,系統(tǒng)隱式地將實(shí)參轉(zhuǎn)換為形參的類型后,賦給形參。

4.函數(shù)有返回值時(shí),系統(tǒng)將自動(dòng)地將返回表達(dá)式類型轉(zhuǎn)換為函數(shù)類型后,賦值給調(diào)用函數(shù)。

在以上情況下,系統(tǒng)會(huì)進(jìn)行隱式轉(zhuǎn)換的。當(dāng)在程序中發(fā)現(xiàn)兩個(gè)數(shù)據(jù)類型不相容時(shí),又不能自動(dòng)完成隱式轉(zhuǎn)換,則將出現(xiàn)編譯錯(cuò)誤。例如:
   int* p = 100;
在這種情況下,編譯程序?qū)?bào)錯(cuò),為了消除錯(cuò)誤,可以進(jìn)行如下所示的強(qiáng)制類型轉(zhuǎn)換:
   int* p = (int *)100;
將整型數(shù)100顯式地轉(zhuǎn)換成指針類型。

構(gòu)造函數(shù)具有類型轉(zhuǎn)換功能

在實(shí)際應(yīng)用中,當(dāng)類定義中提供了單個(gè)參數(shù)的構(gòu)造函數(shù)時(shí),該類便提供了一種將其他數(shù)據(jù)類型的數(shù)值或變量轉(zhuǎn)換為用戶所定義數(shù)據(jù)類型的方法。因此,可以說(shuō)單個(gè)參數(shù)的構(gòu)造函數(shù)提供了數(shù)據(jù)轉(zhuǎn)換的功能。下面通過(guò)一個(gè)例子進(jìn)一步說(shuō)明單參數(shù)構(gòu)造函數(shù)的類型轉(zhuǎn)換功能。

復(fù)制代碼 代碼如下:

#include
classA
{
public:
A(){ m=0; }
A(doublei) { m=i; }
voidprint() { cout<<M<
private:
doublem;
};

voidmain()
{
Aa(5);
a=10; //a與10是不同的數(shù)據(jù)類型
a.print();
}

程序的輸出結(jié)果為:
  10
在該程序中,賦值語(yǔ)句a=10;中,賦值號(hào)兩邊數(shù)值10和對(duì)象a是兩上不相容的數(shù)據(jù)類型,可是它卻能順利通過(guò)編譯程序,并且輸出顯示正確結(jié)果,其主要原因是得益于單參數(shù)的構(gòu)造函數(shù)。編譯系統(tǒng)選通過(guò)標(biāo)準(zhǔn)數(shù)據(jù)類型轉(zhuǎn)換,將整型數(shù)值10轉(zhuǎn)換成double型,然后,再通過(guò)類中定義的單參數(shù)構(gòu)造函數(shù)將double型數(shù)值轉(zhuǎn)換為A類類型,最后把它賦值給a。這些轉(zhuǎn)換都是自動(dòng)隱式完成的。

關(guān)于上面的程序,補(bǔ)充一點(diǎn):
Aa = 10;

Aa;
a= 10;
兩者是不同的,前者對(duì)a進(jìn)行初使化,編譯器會(huì)嘗試將10隱式轉(zhuǎn)換為A類型,這樣將引起a的A(doublei)構(gòu)造函數(shù)直接被調(diào)用。
后者屬于賦值語(yǔ)句,編譯器將建立一個(gè)臨時(shí)對(duì)象,并將10隱式轉(zhuǎn)換為A類型。如果我們顯示調(diào)用
(A)10;
這也將建立一個(gè)臨時(shí)對(duì)象,引起A的構(gòu)造函數(shù)被調(diào)用。

還有一點(diǎn)要注意,編譯器只會(huì)進(jìn)行一次隱式轉(zhuǎn)換(C時(shí)刻庫(kù)的內(nèi)置類型如intshort char等)除外,下面的語(yǔ)句說(shuō)明了這點(diǎn):
m_rst->GetFields()->GetItem(nCol)->Value= (_bstr_t)sValue;
上面Value是COM的變體類型,“Value=”將引起operator= (_bstr_t)被調(diào)用。如果上面省略(_bstr_t),編譯器將發(fā)生錯(cuò)誤,因?yàn)闆](méi)有operator= (char*)這樣的重載,編譯器不會(huì)為我們進(jìn)行兩次以上的隱式轉(zhuǎn)換。

在函數(shù)調(diào)用過(guò)程中,運(yùn)算符重載和構(gòu)造也是一個(gè)函數(shù)調(diào)用,如果匹配的函數(shù)如無(wú)二義性,那么將可以產(chǎn)生一次隱式轉(zhuǎn)換。如果上句的Value變體類只有一個(gè)operate= (_bstr_t),那么既使這樣寫->Value= sValue; 編譯器也會(huì)試圖將sValue隱式轉(zhuǎn)換為_bstr_t類型。

還有一種情況
復(fù)制代碼 代碼如下:

classA
{
inta;
public:
A(){ };
A(int_a) { a = _a; };
Operatorint() { return a; }
}

有如下調(diào)用:
復(fù)制代碼 代碼如下:

Aa(10);
Aa2 = (int)(int)a;   //只相當(dāng)于Aa2 = (int)a; 因?yàn)榈谝粋€(gè)就近已經(jīng)轉(zhuǎn)成了int,第二//個(gè)就不用再轉(zhuǎn)了

比較有意思吧,A類既有將int隱式轉(zhuǎn)換A的構(gòu)造,也有int()轉(zhuǎn)換函數(shù)供強(qiáng)制轉(zhuǎn)換,(int)(int)a將以就近原則的方式進(jìn)行。如果就近轉(zhuǎn)換失敗,編譯器將報(bào)錯(cuò)。比如:
復(fù)制代碼 代碼如下:

classB
{
};
Aa2 = (B)a;

Aa2 = (B)10;

編譯器報(bào)這樣的錯(cuò)誤:"errorC2440: “類型轉(zhuǎn)換”:無(wú)法從“int”轉(zhuǎn)換為“B”"
可知,我們自己編寫的構(gòu)造和轉(zhuǎn)換函數(shù)多么重要。

轉(zhuǎn)換函數(shù)
轉(zhuǎn)換函數(shù)又稱類型強(qiáng)制轉(zhuǎn)換成員函數(shù),它是類中的一個(gè)非靜態(tài)成員函數(shù)。它的定義格式如下:
復(fù)制代碼 代碼如下:

   class<類型說(shuō)明符1>
    {
     public:
      operator<類型說(shuō)明符2>();
      …
    }

這個(gè)轉(zhuǎn)換函數(shù)定義了由<類型說(shuō)明符1>到<類型說(shuō)明符2>之間的映射關(guān)系??梢?,轉(zhuǎn)換函數(shù)是用來(lái)將一種類型的數(shù)據(jù)轉(zhuǎn)換成為另一種類型。下面通過(guò)一個(gè)例子說(shuō)明轉(zhuǎn)換函數(shù)的功能。
復(fù)制代碼 代碼如下:

#include

classRational
{
public:
Rational(intd, int n)
{
den= d;
num= n;
}
operatordouble();//類型轉(zhuǎn)換函數(shù)
private:
intden, num;
};

Rational::operatordouble()
{
returndouble(den)/double(num);
}

voidmain()
{
Rationalr(5, 8);
doubled = 4.7;
d+= r;  //這句將調(diào)用隱式轉(zhuǎn)換,相當(dāng)于d= (double)r;
cout<<d<<ENDL;
}

程序輸出結(jié)果:
5.325

由程序可知,d是一個(gè)double型數(shù)值,r是Rational類的對(duì)象,這兩個(gè)不同類型的數(shù)據(jù)進(jìn)行加法之所以能夠進(jìn)行是得益于轉(zhuǎn)換函數(shù)operatordouble()。為使上述加法能夠進(jìn)行,編譯系統(tǒng)先檢查類Rational的說(shuō)明,看是否存在在下轉(zhuǎn)換函數(shù)能夠?qū)ational類型的操作數(shù)轉(zhuǎn)換為double類型的操作數(shù)。由于Rational類中說(shuō)明了轉(zhuǎn)換函數(shù)operatordouble(),它可以在程序運(yùn)行時(shí)進(jìn)行上述類型轉(zhuǎn)換,因此,該程序中實(shí)現(xiàn)了d=r;的操作。

定義轉(zhuǎn)換函數(shù)時(shí)應(yīng)注意如下幾點(diǎn):
(1)轉(zhuǎn)換函數(shù)是用戶定義的成員函數(shù),但它要是非靜態(tài)的。
(2)轉(zhuǎn)換函數(shù)的不可以有返回值。(意思是聲明中不可以有返回值)
(3)轉(zhuǎn)換函數(shù)也不帶任何參數(shù)。
(4)轉(zhuǎn)換函數(shù)函數(shù)還不能定義為友元函數(shù)。

轉(zhuǎn)換函數(shù)的名稱是類型轉(zhuǎn)換的目標(biāo)類型,因此,不必再為它指定返回值類型;轉(zhuǎn)換函數(shù)是被用于本類型的數(shù)值或變量轉(zhuǎn)換為其他的類型,也不必帶參數(shù)。

類中的構(gòu)造函數(shù)完成其他類型到類類型的轉(zhuǎn)換,而重載強(qiáng)制轉(zhuǎn)換完成類類型到其他類型的轉(zhuǎn)換。

相關(guān)文章

  • C/C++?QT實(shí)現(xiàn)自定義對(duì)話框的示例代碼

    C/C++?QT實(shí)現(xiàn)自定義對(duì)話框的示例代碼

    對(duì)話框分為多種,常見的有通用對(duì)話框,自定義對(duì)話框,模態(tài)對(duì)話框,非模態(tài)對(duì)話框等,本文主要介紹了QT自定義對(duì)話框,感興趣的可以了解一下
    2021-11-11
  • C語(yǔ)言實(shí)現(xiàn)飛機(jī)小游戲

    C語(yǔ)言實(shí)現(xiàn)飛機(jī)小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)飛機(jī)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語(yǔ)言struct結(jié)構(gòu)體介紹

    C語(yǔ)言struct結(jié)構(gòu)體介紹

    C語(yǔ)言中,結(jié)構(gòu)體類型屬于一種構(gòu)造類型(其他的構(gòu)造類型還有:數(shù)組類型,聯(lián)合類型),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言結(jié)構(gòu)體(struct)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 淺談c++調(diào)用python鏈接的問(wèn)題及解決方法

    淺談c++調(diào)用python鏈接的問(wèn)題及解決方法

    下面小編就為大家?guī)?lái)一篇淺談c++調(diào)用python鏈接的問(wèn)題及解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • C語(yǔ)言可變長(zhǎng)的參數(shù)列表詳解

    C語(yǔ)言可變長(zhǎng)的參數(shù)列表詳解

    這篇文章主要為大家介紹了C語(yǔ)言可變長(zhǎng)的參數(shù)列表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • c++ 移動(dòng)構(gòu)造相關(guān)總結(jié)

    c++ 移動(dòng)構(gòu)造相關(guān)總結(jié)

    這篇文章主要介紹了c++ 移動(dòng)構(gòu)造的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-02-02
  • Linux網(wǎng)絡(luò)編程之socket文件傳輸示例

    Linux網(wǎng)絡(luò)編程之socket文件傳輸示例

    這篇文章主要介紹了Linux網(wǎng)絡(luò)編程之socket文件傳輸示例,對(duì)于基于Linux平臺(tái)的C程序員來(lái)說(shuō)有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C語(yǔ)言實(shí)現(xiàn)樹的動(dòng)態(tài)查找實(shí)例代碼

    C語(yǔ)言實(shí)現(xiàn)樹的動(dòng)態(tài)查找實(shí)例代碼

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)樹的動(dòng)態(tài)查找實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++實(shí)現(xiàn)LeetCode(138.拷貝帶有隨機(jī)指針的鏈表)

    C++實(shí)現(xiàn)LeetCode(138.拷貝帶有隨機(jī)指針的鏈表)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(138.拷貝帶有隨機(jī)指針的鏈表),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單彈球游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單彈球游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單彈球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評(píng)論

游戏| 仁布县| 东丰县| 临邑县| 黄大仙区| 辽中县| 浦城县| 凭祥市| 连州市| 宣威市| 新巴尔虎右旗| 石台县| 黑山县| 洛浦县| 仁怀市| 广昌县| 晋州市| 广灵县| 建瓯市| 旬阳县| 逊克县| 渑池县| 张家界市| 凌海市| 孝感市| 安图县| 剑阁县| 昆明市| 莒南县| 日喀则市| 调兵山市| 岳阳县| 东辽县| 寿光市| 广饶县| 曲阜市| 满城县| 无棣县| 嘉兴市| 林西县| 马边|