青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

第一桶 從C到C++ 第二碗 陳老C初論C++ 潘小P進入新天地

     “還真累啊。”老C揉著自己的胳膊。
     看著窗明幾凈的實驗室,清理得整整齊齊的網線和交換機,兩個人都覺得心情很舒暢。吃完了晚飯,兩個人又坐到了白板旁邊。
     “老C,今天早上的話題還沒有談論完呢。”小P總是充滿好奇心,老C覺得小家伙是個人才。
     “稍等稍等,等我把這一點看完。”老C用目光匆匆掠過一篇起點上的穿越文,戀戀不舍的轉過座椅,“好吧,我們再來review一下我們第二版的C代碼。”


typedef enum tagFRUIT{ORANGE, APPLE, BANANA} FRUIT;
typedef void (*PRINT_PROC)(char*);
typedef struct tagFRUIT_INFO
{
    FRUIT               fruit_;   
   
const char* const   name_;
}FRUIT_INFO;

void DoPrintFruitName(char* name)
{
    printf("%s\n", name);
}

void DoPrintFruitNameCompany(char* name)
{
    printf("XJTU's %s\n", name);
}

const FRUIT_INFO g_fruitInfo[] =
{
    ORANGE,    "orange"
    ,APPLE,    "apple"
    ,BANANA,   "banana"
};

void
PrintFruitName(FRUIT fruit, PRINT_PROC printProc)
{
    int i;
   
    for (
         i = 0;
         i < (sizeof(g_fruitInfo)/sizeof(g_fruitInfo[0]));
         ++i
        )
    {
        if (g_fruitInfo[i].fruit_ == fruit)
        {
            (*printProc)(g_fruitInfo[i].name_);
        }
    }
}

int main()
{
    FRUIT fruit;
   
    /* Get the information of fruit. */
    fruit = GetFruitInfo();
    /* Print the name of the fruit. */
    if (/* Print fruit's company. */)
    {
        PrintFruitName(fruit,
DoPrintFruitNameCompany);
    }
    else
    {
        PrintFruitName(
fruit, DoPrintFruitName)
    }

    return 0;
}
     “我們來看看PrintFruitName()函數的問題,它的一個比較明顯的缺陷是效率。”老C用筆指著代碼說道。
     “是啊是啊,”有機會表現一把小P很是高興,“這個函數做了線性查找,因此它的時間效率應當是n。”
     “對,因此對比原版的switch...case...語句的常數時間效率,我們現在的設計在時間效率上有損失,你有什么好辦法解決這個問題嗎?”
     “讓我想想……”小P又開始發動腦筋,“我覺得我們可以使用一個散列表來儲存這些信息,那么在查找的時候算法的時間復雜度就是常數了。”小P找到了解決辦法很是高興,就想著去白板上寫下自己的得意之作。
     “等等別急。”老C攔住小P,“只要知道了解決之道,代碼是微不足道的,你先不要著急寫代碼……”老C對小P的反應速度有些驚訝,“我覺得你的基礎挺好的啊,就是缺乏正確的引導……”
     “呵呵,謝謝啊,其實我就是比較油菜而已。”聽了老C的評論小P有些囧,不知道他是表揚還是批評。
     “我們不著急對這一版進行改寫,現在你試著使用C++來完成上面的代碼。”老C給小P出了新的題目。
     “嗯,我看看啊。”小P開始思索起來,“但是有什么不同嗎?如果使用C++的話,我可能還是會寫出第一版那樣的代碼啊……”
     “所以我說你缺乏正確的引導啊,”老C有些感慨,“因為C++包含了C的部分,因此你完全可以用C的思維方式在C++下編碼,反應到代碼風格上,就是第一版風格的代碼在C++代碼中頻繁出現……”
     “槑,”小P有些莫名其妙,“那么應該怎么做呢?”
     “嗯,我先簡單的寫寫,然后我們來review。”老C在白板上劃了一道線,將白板分為兩部分,在原來的代碼部分上面寫下C,然后在另一個空白部分的頭部寫下C++。

class Fruit
{
public:
    virtual ~Fruit() {}  

public:
    virtual void printName() = 0;
}

class Orange : public Fruit
{
public:
    virtual void printName() { cout <<  "orange" << endl;}
}

class Apple : public Fruit
{
public:
    virtual void printName() { cout << "apple" << endl; }
}

class Banana : public Fruit
{
public:
    virtual void printName() { cout << "bnana" << endl; }
}

void PrintFruitName(const Fruit& fruit)
{
    fruit.printName();
}

int main()
{
    /* Fruit factory function. */
    Fruit* fruit = GetFruit();
    PrintFruitName(*fruit);
   
    delete fruit;
   
    return 0;
}
    
     “唔,”老C揉揉手,“差不多就是這樣啦,一個很簡單的實現……與現實代碼相去甚遠……”他又想了想,“在實際情況下我們是不會這樣編碼的,但在這里只是說明一下思維的差異性。”
     “給我講講吧。”小P等待下文。
     “在這個實現里我們使用了C++的多態特性,也有一種說法是晚綁定……但是無論怎么說,其根源也是信息隱藏。”老C開始比較C和C++的實現,“我們已經比較過第一版和第二版的C實現,發現信息隱藏是進行設計的一個關鍵點……”
     “等等老C,什么叫多態?什么叫晚綁定?”
     “哦,我們來看看PrintFruitName()函數,你能說清楚這個函數具體實現了哪些需求?”如何簡單的解釋這些術語讓老C覺得有些頭痛。
     “從代碼看它實現了對fruit對象名稱的打印……”小P看了看代碼,“但是具體如何做的我看不出來,而且打印的內容與函數的輸入參數有關,不同的參數會有不同的結果……”
     “沒錯!保持統一的接口,而具體行為依照對象而定,不同的對象有不同的行為,這個就是對多態的簡單解釋。”老C覺得小P還是有些悟性的,“具體在C++語 言中,多態通過指針和引用來表現。即接口使用父類的指針或引用來表明抽象的統一的接口,而行為根據父類指針或引用所指向具體子類對象,不同的對象表現出不 同的行為,此乃C++實現多態的風格,具體來說我們在編程的時候需要使用指向父類的指針或者引用,然后在子類中改寫父類中的虛函數,最后再把子類對象賦值 到父類指針或引用上。如果現在我們需要再增加一個梨這樣的水果,你會怎么做?”
     “好像很簡單了?”小P試著在白板上寫下如下代碼。

class Pear : public Fruit
{
public:
    virtual void printName() { cout << "pear" << endl; }
}

     "然后怎么辦?我可能還需要改寫GetFruit()函數,使得他可以增加一個返回的對象類型?"小P很細心的發現一個問題,“但是我覺得我們很難在 GetFruit()函數中避免類似if..else...或者switch...case..之類的邏輯選擇分支……等等,好像我們實現的第二版C語言 代碼也存在類似的問題,就是GetFruitInfo()中也無法避免多選擇的判斷分支……”
     "沒有錯!但是起碼我們對PrintFruitName()函數的維護會好很多。"老C很是贊同小P的觀察力,“這個是另外的問題,涉及到一些 factory模式,我們以后再討論……無論怎么樣,我們先來評判一下現在C++的實現。因為C++的虛函數實際上采用散列表的數據結構實現,所以我們的 C++程序執行效率會比白板另一邊的第二版C代碼好一些。我覺得我以后一定會和你討論一下C++的虛函數的實現的,但是今天我們先把這個問題放一邊。”
     “看來C++還有很多東西是我不了解的啊。”小P開始覺得自己C++課程好像是白上了。
     “我們來比較一下三個版本的實現。”老C開始回顧早上的討論,“你發現什么問題沒有?”
     “好像一段代碼對其具體實現了解的越少,它的維護性就會越好?”小P有些猜測。
     “呵呵,的確,那么我們通過各種不同的方法達到了什么樣的看似相同的目的?”老C開始掉小P的胃口。
     “信息隱藏?”小P不太確定。
     “信息隱藏是手段,但不是目的。”老C很確定的否決掉小P,“我們達到的目的是控制問題的規模!”
     老C覺得有必要給小P講講哲學:“我們寫軟件的目的是為了解決現實生活中的具體問題,沒錯吧?”
     “沒錯,的確是這樣,可是這個和C++有什么關系的?”小P覺得有些莫名其妙。
     “那么你覺得使用高級的語言、先進的設計和合理的開發流程,問題的復雜度會降低嗎?”
     “那是啊,問題的復雜度當然會降低啊。”
     “唉,錯了,問題的復雜度不會降低的,因為問題的復雜度是客觀存在,不會因為人主觀的原因而改變!”
     “槑!”小P有些被震住了,他以前還真是沒有考慮過這樣的問題,“那么為什么我覺得C解決問題比匯編簡單呢?”
     “那是因為問題的規模被控制了!”老C開始強調,“因為C的編連器暗地里幫你做了很多事情來控制問題表現給你的規模,使你感覺好像問題變簡單了——其實是你面對的問題規模變小了。打個比方,”老C在白板上找出了上午最早的程序。

typedef enum tagFRUIT{ORANGE, APPLE, BANANA} FRUIT;

void PrintFruitName(FRUIT fruit)
{
    switch (
fruit)
    {
    case ORANGE:
        pirntf("orange\n");
    break;
   
    case APPLE:
        printf("apple\n");
    break;
   
    case BANANA:
        printf("banana\n");
    break;
   
    default:
        return;  
    }
}


int main()
{
    FRUIT fruit;
   
    /* Get the information of fruit. */
    fruit = GetFruitInfo();
    /* Print the name of the fruit. */
    PrintFruitName(fruit);

    return 0; 
}

     “看看吧,根據你剛才的發現,是不是如果需求發生變化時,GetFruitInfo()和PrintFruitName()這兩個函數都要發生變更?”老C指著代碼問小P。
     “是啊,沒有錯。”
     “現在我們代碼的規模還很小,如果我們在多處需要涉及到水果的信息,那么根據這種風格,如果需求發生變更時,是不是每個地方都需要對源代碼進行修改?”老C開始循循善誘。
     “嗯,好像是的。我們這里只是打印了水果的名稱,如果我們還需要水果的形狀,水果的顏色,哦,好像我們維護時候的復雜度會按照問題的規模成倍的增長。”
     “是啊是啊,這就叫牽一發而動全身。”老C總結道,“那么第二個做法呢?”
     “好像可以好一些,起碼我們只用修改某些表格,哦,還要修改哪個GetFruitInfo()的函數,但是起碼問題的擴散沒有那么嚴重了……”小P現在隱約覺得自己好像腦袋里面有只手,快要抓住什么東西卻又抓不到,有些迷蒙起來。
     “但是維護表格的工作量也不小啊。”老C補充道,“那么最后一種做法呢?”
     “我個人感覺好像C++編連器在幫助我們維護這些表格?”小P好像猛的明白過來,“比如將虛函數的實現隱藏在編連器的后面……”他又開始有些迷蒙……
     “是的,是這樣的。”老C點點頭,“我們實際上面對問題的復雜度并沒有改變,只是由于語言的幫助,我們可以設計出一些代碼來限制我們接觸問題的規模,把一 個復雜的問題逐步劃分到我們自己可以理解的規模上來,這樣好像問題變簡單了一樣。”老C接著說道,“這就是我為什么說我們所使用的語言會影響到我們思考問 題的方法,而我們思考問題的方法會反過來影響我們編碼的風格。”
     小P突然感覺自己來到了一個更寬闊的世界,好像自己突然明白了什么又好像不是很明白……小P開始覺得C++充滿了神秘和樂趣,下決心一定要把C++學好。
     “老C,和你聊聊太有收獲了,我要把這些代碼抄下來回去再看看,體會體會,”小P做激昂狀,“我一定要在3年內學好C++……”
     “等等,3年時間好像太短了吧?”老C有些被雷到了。
     “?”
     “建議你看看《Teach Yourself Programming in Ten Years》這篇文章吧,急是急不來的。”老C覺得年輕人就是浮躁。
     “哦?好,那我回宿舍后查查這篇文章。但是以后你要多教教我啊。”
     “互相討論,互相學習。”老C謙虛道,“C++還有template種類的編程風格,但是我想我們還是討論到此吧,時間也不早了,我們回去吧。”
     “好啊,回去打一盤魔獸,看看誰更厲害!”小P決定也給老C當一回老師過過癮!

     (欲知后事如何,且聽下回分解)

posted on 2009-01-18 14:26 Anderson 閱讀(2209) 評論(11)  編輯 收藏 引用

評論

# re: 第一桶 從C到C++ 第二碗 陳老C初論C++ 潘小P進入新天地 2009-01-18 19:55 蟲牙

Teach Yourself Programming in Ten Years
http://norvig.com/21-days.html
  回復  更多評論   

# re: 第一桶 從C到C++ 第二碗 陳老C初論C++ 潘小P進入新天地 2009-01-18 20:14 ZJOK

很好,再詳細點,通俗點!!  回復  更多評論   

# re: 第一桶 從C到C++ 第二碗 陳老C初論C++ 潘小P進入新天地 2009-01-18 21:29 orz

太~~太~~~有才了~~  回復  更多評論   

# re: 第一桶 從C到C++ 第二碗 陳老C初論C++ 潘小P進入新天地 2009-01-18 22:20 adon

是講設計模式的吧,我是從設計模式才明白面向對象的  回復  更多評論   

# re: 第一桶 從C到C++ 第二碗 陳老C初論C++ 潘小P進入新天地 2009-01-19 09:26 weimi

頂樓主!
用簡單的代碼說明抽象的問題,很好!  回復  更多評論   

# re: 第一桶 從C到C++ 第二碗 陳老C初論C++ 潘小P進入新天地[未登錄] 2009-01-19 10:34 Anderson

@adon
哦,設計模式是內容的一部分,主要包括
1. 從C到C++
1.1 首先接觸類
1.2 越早接觸UML越好
1.3 直接學習C++習語和設計模式
1.4 代碼格式和編程素質,寫優雅的代碼
1.5 C++對象模型
2. 過程,工具,人。
2.1 IDE,配置管理
2.2 漸進的迭代式開發
2.3 以需求(用例)為引導
3. 討論一些高級技巧
3.1 異常安全性
3.2 線程安全
4. 模版與meta programming
5. STL和BOOST,TR1
6. Qt和MFC
7. 其他,可能包括一些XML之類

不會按照順序寫,應當是穿插起來的吧。后面的還沒有想好,接下來應該討論一些從C過渡到C++的故事,中間穿插一些關于IDE,配置管理和C++對象模型的討論吧  回復  更多評論   

# re: 第一桶 從C到C++ 第二碗 陳老C初論C++ 潘小P進入新天地 2009-01-19 10:58 你好

你好,在你第一篇文章中我發現2個bug,
請作者核實下:
typedef enum tagFRUIT{ORANGE, APPLE, BANANA} FRUIT;

typedef struct tagFRUIT_INFO
{
FRUIT fruit_;
const char* name_;
//const char* const name_;
} FRUIT_INFO;

const FRUIT_INFO test[] = {
{ORANGE,_T("xxx")},
{APPLE,_T("fff")}
};
  回復  更多評論   

# re: 第一桶 從C到C++ 第二碗 陳老C初論C++ 潘小P進入新天地[未登錄] 2009-01-19 15:04 Anderson

@你好
const char* const name_ 指的是name_所指向的字符串內容不能被改變,而且name_這個指針也不能被改變,指向其他內容是不行的。

初始化結構體的時候,{}也是可以不用的,不過用上更清晰一些。謝謝。
至于_T,應當是windows開發環境定義的宏吧,用于在windows頭文件定義的WCHAR和CHAR之間做編譯選擇用的,標準C中并沒有定義這個宏,而且
不涉及國際化的時候wchar_t這個類型也是可以不用的吧。

我用的是最新的GCC,代碼可以編譯通過。VS2005上也試了一下,可以通過。

還是謝謝您的評論。  回復  更多評論   

# re: 第一桶 從C到C++ 第二碗 陳老C初論C++ 潘小P進入新天地[未登錄] 2009-01-22 17:01 Len

現在程序員小說很流行,這個系列看來要用大話文來解析細節了,非常不錯  回復  更多評論   

# re: 第一桶 從C到C++ 第二碗 陳老C初論C++ 潘小P進入新天地 2009-03-22 21:09 coast

很有才。  回復  更多評論   

# re: 第一桶 從C到C++ 第二碗 陳老C初論C++ 潘小P進入新天地 2009-09-17 15:01 亂78糟

寫出了我想說但表達不出來的 內容,關注ing...  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2009年1月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

導航

統計

常用鏈接

留言簿(6)

隨筆檔案(21)

文章檔案(1)

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            麻豆久久婷婷| 日韩午夜免费视频| 欧美极品在线视频| 老牛嫩草一区二区三区日本 | 欧美理论电影在线播放| 欧美国产亚洲另类动漫| 欧美精品国产| 欧美日韩国产天堂| 国产精品你懂的在线| 国产亚洲成av人片在线观看桃| 国产亚洲精品成人av久久ww| 在线看日韩av| 中文网丁香综合网| 久久精品国产亚洲aⅴ| 欧美国产激情二区三区| 亚洲片在线资源| 日韩视频一区| 欧美一区二区三区视频在线观看| 美女在线一区二区| 国产精品久久久久久亚洲调教| 欧美吻胸吃奶大尺度电影| 国产日韩欧美高清| 日韩视频在线观看免费| 欧美一区二区三区啪啪| 欧美成人69av| 亚洲视频在线观看视频| 美女尤物久久精品| 国产日韩欧美另类| 正在播放亚洲一区| 欧美v亚洲v综合ⅴ国产v| 这里只有精品视频| 免费不卡在线视频| 国产在线观看91精品一区| 夜夜嗨av一区二区三区| 欧美一区二区三区另类| 黄色一区二区三区四区| 一本久久青青| 欧美va亚洲va国产综合| 午夜精品久久久久久久99樱桃| 欧美激情黄色片| 狠狠色香婷婷久久亚洲精品| 亚洲欧美伊人| 正在播放日韩| 久久三级视频| 亚洲一区二区视频在线| 欧美高清在线视频观看不卡| 国内精品国语自产拍在线观看| 亚洲小说区图片区| 91久久中文| 可以免费看不卡的av网站| 国产一区二区日韩精品| 欧美一区中文字幕| 亚洲午夜91| 国产精品久久久亚洲一区 | 两个人的视频www国产精品| 一区二区三区精品国产| 欧美久久久久免费| 亚洲狼人综合| 亚洲丶国产丶欧美一区二区三区| 欧美资源在线观看| 韩国精品主播一区二区在线观看| 久久精品2019中文字幕| 亚洲欧美日韩在线一区| 国产日产亚洲精品| 久久国产66| 欧美亚洲三区| 国内精品免费在线观看| 久久天天躁狠狠躁夜夜av| 先锋影音国产精品| 韩国精品一区二区三区| 欧美成ee人免费视频| 久久尤物电影视频在线观看| 1769国产精品| 亚洲国产欧美一区二区三区久久| 欧美福利视频在线| 一区二区三区日韩欧美精品| 亚洲视频一区二区在线观看| 国产精品入口麻豆原神| 久久美女艺术照精彩视频福利播放| 欧美综合国产精品久久丁香| 亚洲福利av| 亚洲精品极品| 国产精品一区二区黑丝| 久久精品国产久精国产一老狼 | 欧美在线免费播放| 韩国精品一区二区三区| 欧美激情1区| 欧美私人啪啪vps| 久久精品国产99精品国产亚洲性色| 欧美在线国产| 午夜精品久久久久久久99黑人| 免费在线亚洲| 国产精品一区二区a| 欧美一区2区视频在线观看| 亚洲欧美日韩在线观看a三区 | 夜夜嗨av一区二区三区网页 | 久久亚洲午夜电影| 亚洲肉体裸体xxxx137| 在线一区二区三区做爰视频网站| 国产欧美日韩一区二区三区| 欧美成人黄色小视频| 国产精品xvideos88| 快射av在线播放一区| 欧美日韩国产一区精品一区| 久久久精品国产免大香伊| 欧美精选午夜久久久乱码6080| 午夜天堂精品久久久久| 快播亚洲色图| 久久av一区二区三区亚洲| 免费日韩av| 久久久久高清| 国产精品免费一区二区三区观看| 欧美成人激情视频免费观看| 国产精品亚洲欧美| 亚洲精品免费在线观看| 在线成人av.com| 亚洲欧美成人综合| 国产精品99久久久久久有的能看| 久久都是精品| 久久国产精品久久w女人spa| 欧美午夜精品久久久久久孕妇| 欧美高清视频| 影音先锋日韩资源| 欧美在线一二三四区| 欧美一级播放| 国产精品捆绑调教| 一区二区精品在线| 亚洲一二三区在线| 欧美日韩在线高清| 亚洲三级影院| 日韩视频在线一区二区三区| 免费亚洲视频| 亚洲国产一区二区视频| 亚洲国产精品视频一区| 久久婷婷久久| 欧美大片一区二区| 最新中文字幕一区二区三区| 久久亚洲午夜电影| 免费成人小视频| 一区免费在线| 免费视频久久| 亚洲激情第一页| 9i看片成人免费高清| 欧美日韩一区精品| 在线视频精品一区| 午夜久久久久久| 国产精品综合| 久久精品人人做人人爽| 欧美成人国产一区二区| 亚洲精品资源美女情侣酒店| 欧美日韩成人精品| 欧美一级一区| av成人免费在线| 亚洲一区二区三区欧美| 国产精品亚洲а∨天堂免在线| 亚洲一区二区三区视频播放| 久久不见久久见免费视频1| 国产亚洲人成网站在线观看| 久久久久久网址| 亚洲日本成人网| 香蕉久久夜色精品国产| 亚洲电影免费观看高清完整版在线观看| 久久婷婷麻豆| 一区二区三区国产| 老司机67194精品线观看| 亚洲精品国久久99热| 国产精品久久9| 久久亚洲美女| 一区二区三区欧美亚洲| 久久久久国色av免费看影院 | 在线观看日韩av电影| 欧美精品一级| 亚洲欧美日本日韩| 亚洲第一精品福利| 午夜一区在线| 日韩视频欧美视频| 国内外成人免费激情在线视频| 欧美—级在线免费片| 先锋a资源在线看亚洲| 亚洲人成网站在线播| 欧美一区二区三区四区在线观看 | 香蕉av777xxx色综合一区| 欧美成人午夜| 欧美一级大片在线观看| 日韩一级二级三级| 国内激情久久| 国产精品影视天天线| 亚洲视频网站在线观看| 国产综合色精品一区二区三区| 欧美久久久久久| 久久嫩草精品久久久久| 亚洲天堂免费观看| 亚洲欧洲一区二区三区久久| 老司机精品久久| 久久精彩免费视频| 欧美在线免费视频| 亚洲欧美国产精品专区久久| 亚洲美女精品成人在线视频| 曰韩精品一区二区| 国产一区二区福利|