欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊: 次

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

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

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

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

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

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

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

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

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

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

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

在實際應(yīng)用中,當(dāng)類定義中提供了單個參數(shù)的構(gòu)造函數(shù)時,該類便提供了一種將其他數(shù)據(jù)類型的數(shù)值或變量轉(zhuǎn)換為用戶所定義數(shù)據(jù)類型的方法。因此,可以說單個參數(shù)的構(gòu)造函數(shù)提供了數(shù)據(jù)轉(zhuǎn)換的功能。下面通過一個例子進(jìn)一步說明單參數(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
在該程序中,賦值語句a=10;中,賦值號兩邊數(shù)值10和對象a是兩上不相容的數(shù)據(jù)類型,可是它卻能順利通過編譯程序,并且輸出顯示正確結(jié)果,其主要原因是得益于單參數(shù)的構(gòu)造函數(shù)。編譯系統(tǒng)選通過標(biāo)準(zhǔn)數(shù)據(jù)類型轉(zhuǎn)換,將整型數(shù)值10轉(zhuǎn)換成double型,然后,再通過類中定義的單參數(shù)構(gòu)造函數(shù)將double型數(shù)值轉(zhuǎn)換為A類類型,最后把它賦值給a。這些轉(zhuǎn)換都是自動隱式完成的。

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

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

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

在函數(shù)調(diào)用過程中,運算符重載和構(gòu)造也是一個函數(shù)調(diào)用,如果匹配的函數(shù)如無二義性,那么將可以產(chǎn)生一次隱式轉(zhuǎn)換。如果上句的Value變體類只有一個operate= (_bstr_t),那么既使這樣寫->Value= sValue; 編譯器也會試圖將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; 因為第一個就近已經(jīng)轉(zhuǎn)成了int,第二//個就不用再轉(zhuǎn)了

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

classB
{
};
Aa2 = (B)a;

Aa2 = (B)10;

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

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

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

這個轉(zhuǎn)換函數(shù)定義了由<類型說明符1>到<類型說明符2>之間的映射關(guān)系。可見,轉(zhuǎn)換函數(shù)是用來將一種類型的數(shù)據(jù)轉(zhuǎn)換成為另一種類型。下面通過一個例子說明轉(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是一個double型數(shù)值,r是Rational類的對象,這兩個不同類型的數(shù)據(jù)進(jìn)行加法之所以能夠進(jìn)行是得益于轉(zhuǎn)換函數(shù)operatordouble()。為使上述加法能夠進(jìn)行,編譯系統(tǒng)先檢查類Rational的說明,看是否存在在下轉(zhuǎn)換函數(shù)能夠?qū)ational類型的操作數(shù)轉(zhuǎn)換為double類型的操作數(shù)。由于Rational類中說明了轉(zhuǎn)換函數(shù)operatordouble(),它可以在程序運行時進(jìn)行上述類型轉(zhuǎn)換,因此,該程序中實現(xiàn)了d=r;的操作。

定義轉(zhuǎn)換函數(shù)時應(yīng)注意如下幾點:
(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)換,而重載強制轉(zhuǎn)換完成類類型到其他類型的轉(zhuǎn)換。

上一篇:C++中Operator類型強制轉(zhuǎn)換成員函數(shù)解析

欄    目:C語言

下一篇:C++中返回指向函數(shù)的指針示例

本文標(biāo)題:c++類的隱式轉(zhuǎn)換與強制轉(zhuǎn)換重載詳解

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4169.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有