看板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