• <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++
            日歷
            <2013年2月>
            272829303112
            3456789
            10111213141516
            17181920212223
            242526272812
            3456789
            統(tǒng)計
            • 隨筆 - 92
            • 文章 - 4
            • 評論 - 4
            • 引用 - 0

            導航

            常用鏈接

            留言簿

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

             

              但是從沒聽說過轉換構造函數(shù),隱式轉換函數(shù)也是一樣,C++的確是夠博大精深的,再次嘆服!
              其實我們已經在C/C++中見到過多次標準類型數(shù)據(jù)間的轉換方式了,這種形式用于在程序中將一種指定的數(shù)據(jù)轉換成另一指定的類型,也即是強制轉換,比如:int a = int(1.23),其作用是將1.23轉換為整形1.然而對于用戶自定義的類類型,編譯系統(tǒng)并不知道如何進行轉換,所以需要定義專門的函數(shù)來告訴編譯系統(tǒng)改如何轉換,這就是轉換構造函數(shù)和類型轉換函數(shù)!
              一、轉換構造函數(shù)
              轉換構造函數(shù)(conversion constructor function) 的作用是將一個其他類型的數(shù)據(jù)轉換成一個類的對象?
              當一個構造函數(shù)只有一個參數(shù),而且該參數(shù)又不是本類的const引用時,這種構造函數(shù)稱為轉換構造函數(shù)。
              轉換構造函數(shù)是對構造函數(shù)的重載。
              例如:
              [cpp]
              Complex(double r)
              {
              real=r;
              imag=0;
              }
              其作用是將double型的參數(shù)r轉換成Complex類的對象,將r作為復數(shù)的實部,虛部為0?用戶可以根據(jù)需要定義轉換構造函數(shù),在函數(shù)體中告訴編譯系統(tǒng)怎樣去進行轉換?
              那么如何使用轉換構造函數(shù)進行類型轉換呢?我們看如下的例子:
              [cpp]
              // TypeSwitch.cpp : 定義控制臺應用程序的入口點。
              //
              #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){}; // 定義轉換構造函數(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; // 調用轉換構造函數(shù)將1.2轉換為Complex類型
              c.Print();
              Complex c1(2.9, 4.2);
              Complex c2 = c1 + 3.1; // 調用轉換構造函數(shù)將3.1轉換為Complex類型
              c2.Print();
              return 0;
              }

              不僅可以將一個標準類型數(shù)據(jù)轉換成類對象,也可以將另一個類的對象轉換成轉換構造函數(shù)所在的類對象?如可以將一個學生類對象轉換為教師類對象,可以在Teacher類中寫出下面的轉換構造函數(shù):
              [cpp]
              Teacher(Student& s)
              {
              num=s.num;
              strcpy(name,s.name);
              sex=s.sex;
              }
              使用方法同上!
              注意:
              1.用轉換構造函數(shù)可以將一個指定類型的數(shù)據(jù)轉換為類的對象?但是不能反過來將一個類的對象轉換為一個其他類型的數(shù)據(jù)(例如將一個Complex類對象轉換成double類型數(shù)據(jù))?
              2.如果不想讓轉換構造函數(shù)生效,也就是拒絕其它類型通過轉換構造函數(shù)轉換為本類型,可以在轉換構造函數(shù)前面加上explicit!例如sat答案
              [cpp]
              // TypeSwitch.cpp : 定義控制臺應用程序的入口點。
              //
              #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禁止構造函數(shù)的轉換功能
              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; // 調用類型轉換函數(shù)將c1轉換為double,編譯出錯!
              cout《d《endl;
              return 0;
              }
              二、類型轉換函數(shù)
              用轉換構造函數(shù)可以將一個指定類型的數(shù)據(jù)轉換為類的對象?但是不能反過來將一個類的對象轉換為一個其他類型的數(shù)據(jù)(例如將一個Complex類對象轉換成double類型數(shù)據(jù))?而類型轉換函數(shù)就是專門用來解決這個問題的!
              類型轉換函數(shù)的作用是將一個類的對象轉換成另一類型的數(shù)據(jù)?
              如果已聲明了一個Complex類,可以在Complex類中這樣定義類型轉換函數(shù):
              [cpp]
              operator double( )
              {
              return real;
              }
              類型轉換函數(shù)的一般形式為:
              operator 類型名( )
              {
              實現(xiàn)轉換的語句
              }

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

            posted on 2013-12-01 20:20 HAOSOLA 閱讀(412) 評論(0)  編輯 收藏 引用
             
            Copyright © HAOSOLA Powered by: 博客園 模板提供:滬江博客
            PK10開獎 PK10開獎
            久久精品国产亚洲AV麻豆网站| 国产精品成人99久久久久| 成人精品一区二区久久久| 久久香蕉国产线看观看乱码| 久久久久久久久久免免费精品| 中文成人无码精品久久久不卡 | 久久久久久久综合日本| 九九精品久久久久久噜噜| 久久亚洲精品无码AV红樱桃| 久久久WWW成人免费毛片| 99久久国产宗和精品1上映| 一97日本道伊人久久综合影院| 亚洲AV日韩精品久久久久| 中文字幕无码久久人妻| 91久久精品91久久性色| 一日本道伊人久久综合影| 天天久久狠狠色综合| 久久国产精品无| 91精品国产高清久久久久久91| 久久精品人人做人人妻人人玩 | 久久综合给合综合久久| 久久婷婷色香五月综合激情| 久久中文娱乐网| 久久精品国产第一区二区三区| 久久久久亚洲精品无码网址 | 亚洲伊人久久综合影院| 久久成人18免费网站| 国内精品久久久久久久涩爱| 国产精品99久久免费观看| 久久天堂AV综合合色蜜桃网 | 久久亚洲精品无码AV红樱桃| 一本久道久久综合狠狠躁AV| 国产免费久久精品丫丫| 欧美久久综合性欧美| 精品一区二区久久久久久久网站| 麻豆亚洲AV永久无码精品久久| 亚洲国产日韩综合久久精品| 午夜视频久久久久一区| 日韩精品久久无码中文字幕| 久久精品成人欧美大片| 久久99国产综合精品女同|