看板java
標 題Re: 請問陣列的宣告…
發信站KKCITY (Mon Jun 21 12:41:30 2004)
轉信站ptt!ctu-reader!ctu-peer!news.csie.ncyu!news.ncyu!news.ccu!Yuntech-News
※ 引述《[email protected] (benqer)》之銘言:
> > 我一直希望 C/C++ 能夠把他化簡成
> > function fa (x)
> > {
> > if (x % 1)
> > {
> > cout << "Yes!";
> > return 1;
> > } else {
> > cout << "No!";
> > return 0;
> > }
> > }
> 用template+轉型設施已經可以達成你要的效果, 而且還有type-safe的優
> 點
> 如下:
> template<typename P>
> int fa(P& x)
> {
> if (x % 1) {...return 1;} else{return 0;}
> }
> int i= fa(1);
> class1 c1= fa(1); //class1中必須定義建構式 class1(int i),
> // operator=(int i);
> class2 c2= fa(class3()); //class2 中必須定義建構式 class2(int i) ,
> // operator=(int i);
> // class3必須定義 operator %
fa 只是一個函數。
> 這樣的作法跟script的差別就在於script用一個共通的type來函括所有type
NO, function(x) 並不是用一個共通的 type ,而是使用「隱式 template」!
我的 script 是可以編譯為執行檔的。
> (如vb的variant, js的var) 所以當函式回一個共通的type時,他可能是
> int, 可能是char, 可能是一個object, 這時程式要怎麼處理就完全依靠
> 程式"內隱"的規則. 例如,
> function func(x)
> { if (x==1) return CreateObject("xxx.xxx");
> else return 1;}
> 請問, 呼叫func的客戶端要怎麼能知道他拿到的是int還是 object?
> 答案是客戶端得去了解func的實作內容. 這樣的情形嚴重的傷害到程式
NO, 編譯時期無法確定其型別,但是執行時期可確定。
因為我們不必在編譯時期就確定他的型別!例如 cout << fb(x);
!!!!!!!!!!!!!!!!
> 的封裝與抽像特性. 所以script並不適合開發大型程式.
> 而使用c++, 你可以使用template讓function享有類似script的彈性
> 又不損及type-safety及runtime performace. 댊
script 可以不損及型別安全和效能。這就是我對 C++ 不甚滿意的地方。
> high-level, type-safety, efficiency是c++的特性, 要讓c++改用
> script的方式就好像叫c++自廢武功一樣
> 至於你下面所提的例子, 事實上script的變數並非沒有型別,
> 而是他們都是繼承至同一個共通的型別,好比是java跟.net的共同基底類別
如上所述,並非使用共通型別,而是使用「隱式 template」,
再由編譯器檢查是否符合所有算子以及成員。 時下的 template 不也如此?
> vb的variant也是類似的觀念. 而script把這類別的宣告藏了起來,好讓程式
> 簡化. 所以以下面的c++程式來看, c++也只是把這之間的關係描述出來.
> 你可說c++很繁瑣, 但是至少, 在程式中描述出來的繼承關係, 可以讓
> compiler提早揪出錯誤的型別使用. 減少在runtime出錯的可能. 更可加強
> 程式的可讀性,結構性,邏輯性. 你可以想像一下, 如果dynamic傳回
> 的一定是bicycle or car之類的交通工具, 為何不在程式明確的指出
> dynamic只會回傳交通工具這件事 ,卻要讓使用者冒著可能不小心把回傳
> 的交通工具當成建築物來使用的風險, 其道理何在?
已經說過原因了,我們並不需要在編譯時期就確定他的型別!
時下 C++ 的 virtual 不也如此?我只能說 C++ 太嫩。
> 另外, union的作法絕對是最差的,完全不用考慮.
> > 深入範例:(很重要的編程風格範例)
> > 嘗試思考下面這個例子:
> > function dynamic (x)
> > {
> > if (x % 1)
> > return Bicycle(x);
> > else
> > return Car(x);
> > }
> > 這可好了,編譯器該如何做?我嘗試著將上面的函式翻譯成 C++
> > 解法一:使用基礎類別再加以繼承之。
> > class CC { …略… } ;
> > class Bicycle : CC { …略… };
> > class Car : CC { …略… };
> > template<class T>
> > CC * dynamic(T x)
> > {
> > if (x%1)
> > return new Bicycle(x);
> > else
> > return new Car(x);
> > }
--
┌─────◆程式設計樂園◆─────┐ ╱ ╱  ̄ ▌ ̄  ̄ ╲╱ BBS 城邦
│ CSZone.kkcity.com.tw │ ╲ ╲ ╴ ▌ ▌ ▏ KK免費撥接
└──《From:61.231.188.131
》──┘ 電話:449-1999 帳號:kkcity 密碼:kkcity