• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            C++分析研究  
            C++
            日歷
            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456
            統(tǒng)計(jì)
            • 隨筆 - 92
            • 文章 - 4
            • 評(píng)論 - 4
            • 引用 - 0

            導(dǎo)航

            常用鏈接

            留言簿

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

             

              但是從沒聽說過轉(zhuǎn)換構(gòu)造函數(shù),隱式轉(zhuǎn)換函數(shù)也是一樣,C++的確是夠博大精深的,再次嘆服!
              其實(shí)我們已經(jīng)在C/C++中見到過多次標(biāo)準(zhǔn)類型數(shù)據(jù)間的轉(zhuǎn)換方式了,這種形式用于在程序中將一種指定的數(shù)據(jù)轉(zhuǎn)換成另一指定的類型,也即是強(qiáng)制轉(zhuǎn)換,比如:int a = int(1.23),其作用是將1.23轉(zhuǎn)換為整形1.然而對(duì)于用戶自定義的類類型,編譯系統(tǒng)并不知道如何進(jìn)行轉(zhuǎn)換,所以需要定義專門的函數(shù)來告訴編譯系統(tǒng)改如何轉(zhuǎn)換,這就是轉(zhuǎn)換構(gòu)造函數(shù)和類型轉(zhuǎn)換函數(shù)!
              一、轉(zhuǎn)換構(gòu)造函數(shù)
              轉(zhuǎn)換構(gòu)造函數(shù)(conversion constructor function) 的作用是將一個(gè)其他類型的數(shù)據(jù)轉(zhuǎn)換成一個(gè)類的對(duì)象?
              當(dāng)一個(gè)構(gòu)造函數(shù)只有一個(gè)參數(shù),而且該參數(shù)又不是本類的const引用時(shí),這種構(gòu)造函數(shù)稱為轉(zhuǎn)換構(gòu)造函數(shù)。
              轉(zhuǎn)換構(gòu)造函數(shù)是對(duì)構(gòu)造函數(shù)的重載。
              例如:
              [cpp]
              Complex(double r)
              {
              real=r;
              imag=0;
              }
              其作用是將double型的參數(shù)r轉(zhuǎn)換成Complex類的對(duì)象,將r作為復(fù)數(shù)的實(shí)部,虛部為0?用戶可以根據(jù)需要定義轉(zhuǎn)換構(gòu)造函數(shù),在函數(shù)體中告訴編譯系統(tǒng)怎樣去進(jìn)行轉(zhuǎn)換?
              那么如何使用轉(zhuǎn)換構(gòu)造函數(shù)進(jìn)行類型轉(zhuǎn)換呢?我們看如下的例子:
              [cpp]
              // TypeSwitch.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
              //
              #include "stdafx.h"
              #include <iostream>
              using namespace std;
              class Complex
              {
              public:
              Complex():real(0),imag(0){};
              Complex(double r, double i):real(r),imag(i){};
              Complex(double r):real(r),imag(0){}; // 定義轉(zhuǎn)換構(gòu)造函數(shù)
              void Print(){
              cout《"real = " 《 real 《" image = "《imag《endl;
              }
              Complex& operator+(Complex c){
              return Complex(this->real + c.real, this->imag + c.imag);
              }
              private:
              double real;
              double imag;
              };
              int main(int argc, _TCHAR* argv[])
              {
              Complex c;
              c = 1.2; // 調(diào)用轉(zhuǎn)換構(gòu)造函數(shù)將1.2轉(zhuǎn)換為Complex類型
              c.Print();
              Complex c1(2.9, 4.2);
              Complex c2 = c1 + 3.1; // 調(diào)用轉(zhuǎn)換構(gòu)造函數(shù)將3.1轉(zhuǎn)換為Complex類型
              c2.Print();
              return 0;
              }

              不僅可以將一個(gè)標(biāo)準(zhǔn)類型數(shù)據(jù)轉(zhuǎn)換成類對(duì)象,也可以將另一個(gè)類的對(duì)象轉(zhuǎn)換成轉(zhuǎn)換構(gòu)造函數(shù)所在的類對(duì)象?如可以將一個(gè)學(xué)生類對(duì)象轉(zhuǎn)換為教師類對(duì)象,可以在Teacher類中寫出下面的轉(zhuǎn)換構(gòu)造函數(shù):
              [cpp]
              Teacher(Student& s)
              {
              num=s.num;
              strcpy(name,s.name);
              sex=s.sex;
              }
              使用方法同上!
              注意:
              1.用轉(zhuǎn)換構(gòu)造函數(shù)可以將一個(gè)指定類型的數(shù)據(jù)轉(zhuǎn)換為類的對(duì)象?但是不能反過來將一個(gè)類的對(duì)象轉(zhuǎn)換為一個(gè)其他類型的數(shù)據(jù)(例如將一個(gè)Complex類對(duì)象轉(zhuǎn)換成double類型數(shù)據(jù))?
              2.如果不想讓轉(zhuǎn)換構(gòu)造函數(shù)生效,也就是拒絕其它類型通過轉(zhuǎn)換構(gòu)造函數(shù)轉(zhuǎn)換為本類型,可以在轉(zhuǎn)換構(gòu)造函數(shù)前面加上explicit!例如sat答案
              [cpp]
              // TypeSwitch.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
              //
              #include "stdafx.h"
              #include <iostream>
              using namespace std;
              class Complex
              {
              public:
              Complex():real(0),imag(0){};
              Complex(double r, double i):real(r),imag(i){};
              explicit Complex(double r):real(r),imag(0){}; // explicit禁止構(gòu)造函數(shù)的轉(zhuǎn)換功能
              void Print(){
              cout《"real = " 《 real 《" image = "《imag《endl;
              }
              private:
              double real;
              double imag;
              };
              int main(int argc, _TCHAR* argv[])
              {
              Complex c1(1.2, 2.3), c2;
              double d;
              d = c1 + 1.1; // 調(diào)用類型轉(zhuǎn)換函數(shù)將c1轉(zhuǎn)換為double,編譯出錯(cuò)!
              cout《d《endl;
              return 0;
              }
              二、類型轉(zhuǎn)換函數(shù)
              用轉(zhuǎn)換構(gòu)造函數(shù)可以將一個(gè)指定類型的數(shù)據(jù)轉(zhuǎn)換為類的對(duì)象?但是不能反過來將一個(gè)類的對(duì)象轉(zhuǎn)換為一個(gè)其他類型的數(shù)據(jù)(例如將一個(gè)Complex類對(duì)象轉(zhuǎn)換成double類型數(shù)據(jù))?而類型轉(zhuǎn)換函數(shù)就是專門用來解決這個(gè)問題的!
              類型轉(zhuǎn)換函數(shù)的作用是將一個(gè)類的對(duì)象轉(zhuǎn)換成另一類型的數(shù)據(jù)?
              如果已聲明了一個(gè)Complex類,可以在Complex類中這樣定義類型轉(zhuǎn)換函數(shù):
              [cpp]
              operator double( )
              {
              return real;
              }
              類型轉(zhuǎn)換函數(shù)的一般形式為:
              operator 類型名( )
              {
              實(shí)現(xiàn)轉(zhuǎn)換的語句
              }

              注意事項(xiàng):
              1.在函數(shù)名前面不能指定函數(shù)類型,函數(shù)沒有參數(shù)?
              2.其返回值的類型是由函數(shù)名中指定的類型名來確定的?
              3.類型轉(zhuǎn)換函數(shù)只能作為成員函數(shù),因?yàn)檗D(zhuǎn)換的主體是本類的對(duì)象,不能作為友元函數(shù)或普通函數(shù)?
              4.從函數(shù)形式可以看到,它與運(yùn)算符重載函數(shù)相似,都是用關(guān)鍵字operator開頭,只是被重載的是類型名?double類型經(jīng)過重載后,除了原有的含義外,還獲得新的含義(將一個(gè)Complex類對(duì)象轉(zhuǎn)換為double類型數(shù)據(jù),并指定了轉(zhuǎn)換方法)?這樣,編譯系統(tǒng)不僅能識(shí)別原有的double型數(shù)據(jù),而且還會(huì)把Complex類對(duì)象作為double型數(shù)據(jù)處理托福答案
              [cpp]
              // TypeSwitch.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
              //
              #include "stdafx.h"
              #include <iostream>
              using namespace std;
              class Complex
              {
              public:
              Complex():real(0),imag(0){};
              Complex(double r, double i):real(r),imag(i){};
              Complex(double r):real(r),imag(0){}; // 定義轉(zhuǎn)換構(gòu)造函數(shù)
              void Print(){
              cout《"real = " 《 real 《" image = "《imag《endl;
              }
              operator double(){ // 定義類型轉(zhuǎn)換函數(shù)
              return real;
              }
              private:
              double real;
              double imag;
              };
              int main(int argc, _TCHAR* argv[])
              {
              Complex c1(1.2, 2.3);
              double d;
              d = c1 + 1.1; // 調(diào)用類型轉(zhuǎn)換函數(shù)將c1轉(zhuǎn)換為double
              cout《d《endl;
              return 0;
              }
              本例中,對(duì)于d = c1 + 1.1;先調(diào)用類型轉(zhuǎn)換函數(shù)將c1轉(zhuǎn)為double類型,然后在與1.1相加!
              那么程序中的Complex類對(duì)具有雙重身份,既是Complex類對(duì)象,又可作為double類型數(shù)據(jù)?Complex類對(duì)象只有在需要時(shí)才進(jìn)行轉(zhuǎn)換,要根據(jù)表達(dá)式的上下文來決定?轉(zhuǎn)換構(gòu)造函數(shù)和類型轉(zhuǎn)換運(yùn)算符有一個(gè)共同的功能: 當(dāng)需要的時(shí)候,編譯系統(tǒng)會(huì)自動(dòng)調(diào)用這些函數(shù),建立一個(gè)無名的臨時(shí)對(duì)象(或臨時(shí)變量)?

            posted on 2013-12-01 20:20 HAOSOLA 閱讀(420) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


             
            Copyright © HAOSOLA Powered by: 博客園 模板提供:滬江博客
            PK10開獎(jiǎng) PK10開獎(jiǎng)
            亚洲精品无码久久久久AV麻豆| 亚洲AV乱码久久精品蜜桃| 国产农村妇女毛片精品久久| 国产精品美女久久久免费| 综合久久精品色| 国产成人精品白浆久久69| 久久久久国产精品嫩草影院| 一个色综合久久| 成人精品一区二区久久久| 亚洲精品无码专区久久久| 国产午夜精品久久久久九九| 久久国产劲爆AV内射—百度| 日本免费久久久久久久网站| 欧美激情一区二区久久久| 国产成人无码精品久久久久免费| 久久夜色精品国产亚洲| 国产精品VIDEOSSEX久久发布| 亚洲AV无码久久精品狠狠爱浪潮| 久久久久亚洲?V成人无码| AV无码久久久久不卡蜜桃| 午夜欧美精品久久久久久久| 日韩精品无码久久一区二区三| 久久精品国内一区二区三区| 久久久久无码精品国产不卡| 国产精品久久久久久久app| 亚洲七七久久精品中文国产| 精品久久久久久久久久久久久久久| 人妻无码中文久久久久专区| 成人免费网站久久久| 亚洲香蕉网久久综合影视| 久久亚洲中文字幕精品一区四| 99精品国产在热久久| 亚洲va久久久噜噜噜久久天堂| 久久夜色精品国产亚洲av| 久久综合国产乱子伦精品免费| 91性高湖久久久久| 久久婷婷人人澡人人| 国产免费福利体检区久久 | 久久精品无码一区二区WWW| 久久99精品国产麻豆宅宅| 精品国产乱码久久久久久呢|