亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

c++類的隱式轉換與強制轉換重載詳解

2020-01-26 15:53:16
字體:
來源:轉載
供稿:網友

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

(2)否則,尋找一個函數模板,將其實例化產生一個匹配的重載函數,若找到則調用;

(3)否則,尋找可以通過類型轉換進行參數匹配的重載函數,若找到則調用它。

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

C語言編譯系統提供的內部數據類型的自動隱式轉換規則如下:

1.程序在執行算術運算時,低類型可以轉換為高類型。

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

3.當在函數調用時,將實參值賦給形參,系統隱式地將實參轉換為形參的類型后,賦給形參。

4.函數有返回值時,系統將自動地將返回表達式類型轉換為函數類型后,賦值給調用函數。

在以上情況下,系統會進行隱式轉換的。當在程序中發現兩個數據類型不相容時,又不能自動完成隱式轉換,則將出現編譯錯誤。例如:
   int* p = 100;
在這種情況下,編譯程序將報錯,為了消除錯誤,可以進行如下所示的強制類型轉換:
   int* p = (int *)100;
將整型數100顯式地轉換成指針類型。

構造函數具有類型轉換功能

在實際應用中,當類定義中提供了單個參數的構造函數時,該類便提供了一種將其他數據類型的數值或變量轉換為用戶所定義數據類型的方法。因此,可以說單個參數的構造函數提供了數據轉換的功能。下面通過一個例子進一步說明單參數構造函數的類型轉換功能。

復制代碼 代碼如下:

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

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

程序的輸出結果為:
  10
在該程序中,賦值語句a=10;中,賦值號兩邊數值10和對象a是兩上不相容的數據類型,可是它卻能順利通過編譯程序,并且輸出顯示正確結果,其主要原因是得益于單參數的構造函數。編譯系統選通過標準數據類型轉換,將整型數值10轉換成double型,然后,再通過類中定義的單參數構造函數將double型數值轉換為A類類型,最后把它賦值給a。這些轉換都是自動隱式完成的。

關于上面的程序,補充一點:
Aa = 10;

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

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

在函數調用過程中,運算符重載和構造也是一個函數調用,如果匹配的函數如無二義性,那么將可以產生一次隱式轉換。如果上句的Value變體類只有一個operate= (_bstr_t),那么既使這樣寫->Value= sValue; 編譯器也會試圖將sValue隱式轉換為_bstr_t類型。

還有一種情況
復制代碼 代碼如下:

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

有如下調用:
復制代碼 代碼如下:

Aa(10);
Aa2 = (int)(int)a;   //只相當于Aa2 = (int)a; 因為第一個就近已經轉成了int,第二//個就不用再轉了

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

classB
{
};
Aa2 = (B)a;

Aa2 = (B)10;

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

轉換函數
轉換函數又稱類型強制轉換成員函數,它是類中的一個非靜態成員函數。它的定義格式如下:
復制代碼 代碼如下:

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

這個轉換函數定義了由<類型說明符1>到<類型說明符2>之間的映射關系??梢?,轉換函數是用來將一種類型的數據轉換成為另一種類型。下面通過一個例子說明轉換函數的功能。
復制代碼 代碼如下:

#include

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

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

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

程序輸出結果:
5.325

由程序可知,d是一個double型數值,r是Rational類的對象,這兩個不同類型的數據進行加法之所以能夠進行是得益于轉換函數operatordouble()。為使上述加法能夠進行,編譯系統先檢查類Rational的說明,看是否存在在下轉換函數能夠將Rational類型的操作數轉換為double類型的操作數。由于Rational類中說明了轉換函數operatordouble(),它可以在程序運行時進行上述類型轉換,因此,該程序中實現了d=r;的操作。

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

轉換函數的名稱是類型轉換的目標類型,因此,不必再為它指定返回值類型;轉換函數是被用于本類型的數值或變量轉換為其他的類型,也不必帶參數。

類中的構造函數完成其他類型到類類型的轉換,而重載強制轉換完成類類型到其他類型的轉換。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品久久中文字幕佐佐木| 国产一区二区三区久久精品| 亚洲中国色老太| 热久久这里只有| 亚洲欧洲av一区二区| 亚洲护士老师的毛茸茸最新章节| 热久久视久久精品18亚洲精品| 日韩中文字幕网站| 亚洲欧美国产视频| 亚洲第一国产精品| 国产99久久精品一区二区 夜夜躁日日躁| 久久久久久久久久国产| 国产精品对白刺激| 精品久久中文字幕久久av| 亚洲激情国产精品| 久久噜噜噜精品国产亚洲综合| 国产精品吊钟奶在线| 亚洲男人av在线| 成人激情黄色网| 国产不卡在线观看| 7777免费精品视频| 久久久久久久久久久免费精品| 中文字幕久精品免费视频| 国产精品va在线播放我和闺蜜| 国产成人精品久久亚洲高清不卡| 欧美孕妇与黑人孕交| 成人久久久久爱| 国产精品99久久久久久久久久久久| 这里只有精品在线观看| 国产精品美女久久| 日本欧美在线视频| 97在线观看免费高清| 亚洲精品中文字幕女同| 2019中文字幕在线观看| 性色av一区二区三区红粉影视| 日韩有码在线电影| 亚洲一区二区福利| 欧美日韩综合视频| 日韩人体视频一二区| 青青在线视频一区二区三区| 主播福利视频一区| 欧美高清videos高潮hd| 色吧影院999| 日韩av中文字幕在线播放| 久久综合五月天| 91国自产精品中文字幕亚洲| 久久精品国产一区二区三区| 亚洲国产古装精品网站| 日韩在线观看你懂的| 久久99精品久久久久久噜噜| 国产精品吴梦梦| 日韩大片免费观看视频播放| 91av在线国产| 久久精品免费播放| 日韩女优人人人人射在线视频| 欧美风情在线观看| 欧美极品在线视频| 久久久亚洲国产天美传媒修理工| 国产成人精品久久亚洲高清不卡| 国产精品99久久99久久久二8| 日本免费一区二区三区视频观看| 精品久久久久久久久久久久久久| 欧美性视频在线| 国产999在线观看| 中文亚洲视频在线| 久久久久久国产精品三级玉女聊斋| 91地址最新发布| 亚洲天堂av在线免费观看| 亚洲欧美国产另类| 欧美极品美女电影一区| 国产成人97精品免费看片| 8090理伦午夜在线电影| 久久久国产精品x99av| 欧美另类精品xxxx孕妇| 欧美中文字幕在线播放| 亚洲国产一区二区三区在线观看| 欧美一级片久久久久久久| 欧美成人一区二区三区电影| 日本成人激情视频| 国产免费一区二区三区在线观看| 国产人妖伪娘一区91| 精品久久久香蕉免费精品视频| 日本韩国欧美精品大片卡二| 国产精品88a∨| 欧美极品少妇xxxxⅹ免费视频| 午夜剧场成人观在线视频免费观看| 欧美激情一区二区三区高清视频| 97**国产露脸精品国产| 91影院在线免费观看视频| 97在线免费视频| 中文字幕欧美精品在线| 欧美日韩在线视频一区二区| 日韩高清电影好看的电视剧电影| 91九色国产视频| 久久精品电影网| 欧美精品免费在线观看| 日韩在线激情视频| 日韩中文字幕精品视频| 欧美亚洲日本网站| 欧美精品在线看| 欧美成人午夜激情视频| 国产玖玖精品视频| 精品动漫一区二区| 亚洲成人aaa| 精品成人乱色一区二区| 97婷婷涩涩精品一区| 亚洲国产精品视频在线观看| 性金发美女69hd大尺寸| 日韩电影免费在线观看| www.久久草.com| 日韩欧美aⅴ综合网站发布| 精品视频在线播放免| 91精品国产色综合| 亚洲欧美一区二区三区在线| 伊人久久综合97精品| 欧美激情精品久久久久| 中文字幕欧美日韩精品| 亚洲欧美国产一区二区三区| 欧美日韩国产区| 日韩h在线观看| 亚洲国产成人精品女人久久久| 日本最新高清不卡中文字幕| 欧美不卡视频一区发布| 91情侣偷在线精品国产| 不卡av在线播放| 91亚洲国产成人久久精品网站| 欧美另类极品videosbestfree| 久久久久久久一区二区三区| 亚洲偷欧美偷国内偷| 日韩av电影手机在线| 国产综合在线视频| 欧美日韩中国免费专区在线看| 国产精品美女呻吟| 久久av.com| 色多多国产成人永久免费网站| 91亚洲精品久久久| 欧美日韩国产一中文字不卡| 97成人精品区在线播放| 欧美性受xxx| 亚洲影院高清在线| 欧美一级淫片videoshd| 欧美日韩在线观看视频小说| 色在人av网站天堂精品| 亚洲精品国产精品国自产观看浪潮| 久久久之久亚州精品露出| 日韩欧美中文字幕在线观看| 欧美一级电影免费在线观看| 欧美日韩一区二区三区| 欧美电影院免费观看| 91地址最新发布| 欧美日韩国产精品一区二区三区四区| 久久精品国产96久久久香蕉| 大伊人狠狠躁夜夜躁av一区| 国产精品视频免费观看www| 亚洲第一网站男人都懂| 国产精品香蕉国产| 亚洲人成网在线播放| 久久亚洲影音av资源网| 91综合免费在线| 奇门遁甲1982国语版免费观看高清| 亚洲成人亚洲激情| 成人久久久久久| 亚洲精品按摩视频| 国产精品夜间视频香蕉|