• <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>

            Note of Justin

            關于工作和讀書的筆記

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              47 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

            留言簿(14)

            搜索

            •  

            積分與排名

            • 積分 - 53106
            • 排名 - 433

            最新評論

            閱讀排行榜

            評論排行榜

            [原創文章歡迎轉載,但請保留作者信息]
            Justin 于 2010-04-26


            看完以后覺得講的其實是如何用模板函數來讓拷貝構造函數和賦值運算符接受所有可能的輸入。

            首先對于內建類型的對象,他們作為函數參數時,參數的類型轉換是自動發生的。比如說派生類對象的指針,如果需要,會被轉換為其父類對象的指針。
            而對于智能指針,要完成類似的轉換需要編寫額外的代碼才能實現。
            如書中例子所示,如果類Base是類Derived的父類,對于下面的一個模板類:
            template?<typename?T>
            class?SmartPointer?{
            public:
            ???
            explicit?SmartPointer(T?*?pointer);
            //..
            }

            經管這兩個智能指針指向的對象是有繼承關系的,SmartPointer<Base>和SmartPointer<Derived>對于編譯器來說完全沒有聯系。
            于是,如果一個函數聲明了接受一個SmartPointer<Base>類型的參數,就無法給它傳進一個SmartPointer<Derived>類型的指針了。

            為了能夠讓智能指針對象也具備一般指針的隱式轉換能力,首先可以做的工作是改造智能指針的構造函數,讓對象生成的時候可以依照具體情況“變態”成實際需要的對象類型。好吧,那我們現在就開始做……
            打?。∮袃蓚€問題需要考慮:第一是我們怎么知道智能指針構造函數的輸入參數pointer是什么類型?又怎么知道真正需要的目標類型是什么?如果不知道我們怎么寫這個構造函數?第二是就算我們知道了輸入的類型和生成的類型,有多少種這樣的搭配是SmartPointer需要接受的?如果有100對不同的類型搭配,我們就要寫100種構造函數嗎?
            解決這些問題的辦法:用“模板化”的構造函數。(member function templates)
            template?<typename?T>
            class?SmartPointer?{
            public:
            ???template?
            <typename?U>
            ???SmartPointer(
            const?SmartPointer<U>&?input)?:?myPointer(?input.get()?)
            ???{
            //..
            ???}
            ???T
            *?get()?const?{?return?myPointer;?}
            ???
            //..
            private:
            ???T
            *?myPointer;
            };

            上面的方案個人感覺很繞,不過確實也解決了問題。
            大概分析一下:
            • 其中的構造函數是一個模板函數,接受參數為U類型的對象,構造出指向T的指針。
            • 但是很明顯我們不需要一個能夠接受任意類型再生成任意類型對象的構造函數。這樣會天下大亂的。于是就有了get()對myPointer的初始化:構造函數的輸入參數input所持有的指針是可以用get()來得到的,然后有這個“get”來的指針去初始化目標對象所持有的指針,到了這一步,就和一般指針的隱式轉換沒有差別了:
              • 如果可以轉換,智能指針SmartPointer<U>就順利轉換為SmartPointer<T>;
              • 如果不能轉換,構造函數就失敗。
            • 這里的構造函數沒有explicit修飾,因此類型的轉換是隱式的。如果真有這個必要,就加上explicit,這樣就需要顯式地聲明需要進行類型轉換。
            • 當一個類沒有定義自己的構造函數時(包括賦值構造函數和拷貝構造函數),編譯器會“幫你”創建默認的構造函數。編譯器不會理睬“模板化”的構造函數,如果一個類中只有“模板化”的構造函數,它還是會繼續生產默認的構造函數。因此,如果不想讓編譯器做多余的事,就有必要自己寫好非模板化的構造函數,以此讓編譯器“閉嘴”@#¥%
            posted on 2010-04-26 08:45 Justin.H 閱讀(1392) 評論(0)  編輯 收藏 引用 所屬分類: Effective C++ 炒冷飯
            97精品国产97久久久久久免费| 久久婷婷五月综合国产尤物app| 国产一级持黄大片99久久| 久久99精品国产麻豆宅宅| 久久天天日天天操综合伊人av| 99精品久久久久久久婷婷| 99久久免费国产精品热| 亚洲色欲久久久久综合网| 丰满少妇高潮惨叫久久久| 色婷婷久久久SWAG精品| 国产精品一区二区久久不卡| 日韩欧美亚洲国产精品字幕久久久 | 欧美久久天天综合香蕉伊| 人妻少妇久久中文字幕| 亚洲性久久久影院| 精品久久久久久国产| 99精品久久精品一区二区| 欧美久久综合九色综合| 亚洲国产成人久久综合一| 久久亚洲美女精品国产精品| 久久无码人妻精品一区二区三区 | 精品久久久久久久久久久久久久久| 99久久精品免费看国产一区二区三区| 国产三级精品久久| 潮喷大喷水系列无码久久精品| 免费精品久久天干天干| 色婷婷综合久久久久中文字幕| 亚洲国产成人久久精品影视| 久久精品国产91久久综合麻豆自制| 久久久久亚洲av成人网人人软件 | 国产日产久久高清欧美一区| 精品久久久久久无码专区不卡| 久久综合亚洲欧美成人| 国内精品久久久久久久久电影网| 久久综合久久鬼色| 无码人妻久久一区二区三区蜜桃| 久久久精品视频免费观看| 日韩精品国产自在久久现线拍| 办公室久久精品| 久久精品免费大片国产大片| 欧美激情精品久久久久久|