• <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>
            隨筆 - 55  文章 - 15  trackbacks - 0
            <2012年4月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

                 摘要: MVVM的目的是為了把表現與邏輯分開來,相互之間不要有太大的影響,讓程序員能夠專心地做某一塊。但有些時候必須要有聯系,外部傳入數據,控件接收數據,并傳入后臺處理,后臺處理后的數據又要顯示在控件上,這就需要數據綁定。數據綁定的方法已經說了幾遍了,有3種方法,一種是源和目標都是依賴屬性的時候,直接在Xaml文件中binding就行了,方法也比較簡單;第二種和第三種方法針對的都是源不是依賴屬性的時候,但目標必須是依賴屬性,這時第二種方法要使用INotifyPropertyChanged接口,當屬性改變的時候,一個Event被激活,并且提醒Binding對象將新值寫入目標數據;第三種方法是設置DataContext,這種方法最簡單,只需要在Xaml文件中設置一下就好。  閱讀全文
            posted @ 2012-06-26 17:24 Dino-Tech 閱讀(1415) | 評論 (0)編輯 收藏
                 摘要: windows 8 基本概念  閱讀全文
            posted @ 2012-06-12 18:43 Dino-Tech 閱讀(621) | 評論 (1)編輯 收藏


            #include <iostream>
            using namespace std;
            template<typename t>
            t maximum(t a, t b){
                cout << "template" << endl;
                return a>b?a:b;
            }

            template<>
            const char* maximum(const char* a, const char* b){
                return strlen(a) > strlen(b)? a:b;
            }

            //template<>
            //char* maximum(char* a, char* b){
            //    return strlen(a) > strlen(b)? a:b;
            //}//如果沒有const 的話,依舊會調用最上面的模板,因為編譯器不能準確匹配,所以必須為const才行。

            int main(){
                cout << maximum("pfdsfasdakis", "kadf") << endl;
            }



            #include <iostream>
            using namespace std;

            template<typename T>
            class TestClass{
            public:
                void F(T pT){
                    cout << " T version " << endl;
                    cout << pT << endl;
                }
            };


            template<>
            class TestClass<int>{
            public:
                void F(int pT){
                    cout << "int version " << endl;
                    cout << pT << endl;
                }
                void F(char pT){
                    cout << "int version " << endl;
                    cout << pT << endl;
                }如果這里修改成接受char型的參數,并且在main函數中調用obj2.F('a'),同樣的,會調到該函數,所以說,編譯器是在看到“TestClass<int> obj2;“這句的時候就知道該調用哪個了。
                void g(){}
            };//特化的類在編譯器中已經跟原來的類名字不同了,所以是兩個東西,但是編譯器要找一個最符合的名字。TestClass_int 可以在里面修改東西

            int main(){
                TestClass<char> obj1;
                TestClass<int> obj2;
                obj1.F('A');
                obj2.F(10);
                obj2.g();
                return 0;
            }

            posted @ 2012-06-04 19:57 Dino-Tech 閱讀(327) | 評論 (0)編輯 收藏
            一個函數接受一個基類的指針或者引用,傳入一個子類的指針或者引用(向上類型轉換),希望調用子類的相應函數。目的:以后添加新的子類,都可以傳入該函數。
            早綁定:編譯器通過上下文,判斷該函數屬于哪個對象,并在編譯期將函數名與函數地址綁定。
            晚綁定:在運行的時候,判斷該函數屬于哪個對象,并在運行時將函數名與函數地址綁定。必須有類型信息裝在對象自身中。
            聲明時添加virtual關鍵字,定義時不需要。

            使用指針和引用的目的是讓編譯器不能完全知道該對象的確切類型,不然就會調用早綁定。晚綁定是根據VTABLE來實現,并且基類和子類的每個虛函數的排列順序都是相同的,所以調用函數的時候已經不是通過名字來調用,而是通過指令,通過函數地址的偏移量來調用了。

            抽象基類的意義,為子類提供一個公共的接口。

            通過基類指針調用基類中不存在的函數是危險的,因為,也許你恰好知道子類對象中有這個函數,那你的調用時成功的,但是萬一木有呢?
            class Base(){
            public:
             virtual void f(){}
            };

            class Derived1: public Base
            {
            public:
             virtual void f(){}
             virtual void g(){}
            };
            class Derived2: public Base
            {
            public:
             virtual void f(){}
             virtual void m(){}
            };

            void func(Base* b){
            b->g();
            }
            int main{
            Base*Test1 = new Derived1;
            Base*Test2 = new Derived2;
            func(Test1);// right;
            func(Test2);// crash
            }

            這里涉及到運行時類型識別(RTTI)和向下類型轉換問題。向下類型轉換不安全,因為沒有類型信息,基類指針不知道基類的內存塊之后的東西是屬于哪個子類的,如果轉錯,將會比較麻煩。

            在編程時注意防止對象的切片,如果按傳值方式而不是傳址和傳引用方式
            將子類對象傳入一個接受基類對象的函數中去的話,那么,只拷貝子類對象中基類的部分數據,又因為編譯器能明確地知道該對象的類型,所以不會產生晚綁定,而是早綁定。我們應該避免在這種情況下傳值。

            如果重新定義了基類中的虛函數,則基類中其他重載版本將被隱藏。(同非虛函數一樣)
            如果重載了基類中的虛函數,則基類中其他版本將被隱藏(同非虛函數一樣)
            不能在子類中修改基類中虛函數的返回值(非虛函數可以修改返回值,并且隱藏其他重載版本)
            但是,也有特例
            class PetFood{
            public:
              virtual string foodType() const = 0;
            };

            class Pet{
            public:
              virtual string type() const = 0;
              virtual PetFood* eat() = 0;
            };

            class Bird : public Pet{
            public:
              string type()const {return "bird";}
              class BirdFood  :  public PetFood{
                public:
                  string foodType()const{
                     return "Bird food";
                   }
                 };
               PetFood* eat(){ return &bf;}
            private:
               BirdFood bf;
            };

            class Cat: public Pet{
            public:
              string type()const {return "cat";}
              class CatFood  :  public PetFood{
                public:
                  string foodType()const{
                     return "Cat food";
                   }
                 };
               CatFood* eat(){ return &cf;}// Here, you can return a CatFood*, because it's a PetType* type. Why don't return a type as PetFood? See segment in main()
            private:
               CatFood cf;
            };

            int main(){
             Bird b;
             Cat c;
             Cat::CatFood* cf = c.eat();
             Bird::BirdFood* bf = b.eat();//downcast, warning!!!Cast PetFood* to BirdFood. So you better return a special pointer, not a base type.
            }
            }
            返回確切的類型要更通用些。

            vptr vtable由誰來初始化?構造函數?是編譯器插入一小段代碼在構造函數中初始化。
            派生類只訪問它自己的成員,而不訪問基類的成員。只有基類的構造函數才能正確地初始化自己的成員。所以要在構造函數中:子要可能,我們應該在這個構造函數初始化列表中從初始化所有的成員對象(通過組合置于類中),因為你必須保證所有的東西都被初始化了,才能使用該對象。

            在構造函數中調用虛函數,調用的只是本地版本。
            原因:該對象還未初始完畢,但是vptr已經初始化,而且指向自己的vtable,所以調用的只是本地的函數。


            1
            posted @ 2012-06-04 16:27 Dino-Tech 閱讀(240) | 評論 (0)編輯 收藏
                 摘要: 代碼重用的手段,利用已有的類。
            組合:類似于使用工具,現有的類作為子對象。砍樹:斧頭作為子對象
            繼承:類似于學習本領,現有的類作為師父。砍樹:拜師練習砍樹的本領。  閱讀全文
            posted @ 2012-06-04 14:37 Dino-Tech 閱讀(205) | 評論 (0)編輯 收藏
                 摘要: 重載運算符,是STL的基礎。  閱讀全文
            posted @ 2012-06-01 16:48 Dino-Tech 閱讀(274) | 評論 (0)編輯 收藏
                 摘要: 引用必須和一個存儲單元聯系起來;傳值的時候會使用拷貝構造函數,為了防止位拷貝,最好自己寫拷貝構造函數。為了防止傳值,使拷貝構造函數為私有的,這里有個例子ostream os,不能這么寫,必須傳遞引用 ostream& os。  閱讀全文
            posted @ 2012-05-31 17:01 Dino-Tech 閱讀(196) | 評論 (0)編輯 收藏
                 摘要: static 的各種應用。  閱讀全文
            posted @ 2012-05-31 14:30 Dino-Tech 閱讀(144) | 評論 (0)編輯 收藏
                 摘要: 編譯器處理內聯函數的策略。  閱讀全文
            posted @ 2012-05-30 16:45 Dino-Tech 閱讀(253) | 評論 (0)編輯 收藏
                 摘要: 內部鏈接,成員函數,常量表達式,傳參和返回值,類里面的const  閱讀全文
            posted @ 2012-05-30 16:12 Dino-Tech 閱讀(169) | 評論 (0)編輯 收藏
            僅列出標題
            共6頁: 1 2 3 4 5 6 
            囯产精品久久久久久久久蜜桃 | 人人狠狠综合88综合久久| 久久精品国产一区二区三区日韩| 97超级碰碰碰久久久久| 国产精品激情综合久久| 久久久久亚洲AV无码观看| 99久久人妻无码精品系列蜜桃| 91精品婷婷国产综合久久| 久久久久亚洲AV无码专区桃色| 久久久久久综合网天天| 欧美久久精品一级c片片| 99久久国产亚洲综合精品| 久久精品国内一区二区三区| 久久久久久久精品妇女99| 99久久99久久精品国产| 中文无码久久精品| 一级做a爰片久久毛片毛片| 亚洲综合精品香蕉久久网97 | 97久久国产亚洲精品超碰热| 伊色综合久久之综合久久| 国产—久久香蕉国产线看观看| 亚洲AV日韩精品久久久久久久| 久久久久国产成人精品亚洲午夜| 久久国产精品无码一区二区三区| 波多野结衣久久一区二区| 亚洲国产日韩欧美综合久久| 国产激情久久久久影院老熟女| 国产精品久久久久天天影视| 色狠狠久久AV五月综合| 久久久噜噜噜久久中文字幕色伊伊 | 久久精品国产精品亚洲下载| 国产精品福利一区二区久久| 奇米影视7777久久精品| 久久综合综合久久综合| 久久亚洲欧美国产精品| 久久夜色精品国产噜噜噜亚洲AV| 久久久久久精品久久久久| 欧美国产成人久久精品| 99久久国产综合精品女同图片 | 欧美麻豆久久久久久中文| 中文精品99久久国产|