华中科技大学马光志C++教学中的一个错误程序

 同学们注意了:

class STACK{
    int  p,  c,  *e;  //c存放元素个数,  p存放位置, e用于存放元素
public:
    virtual  int  getp (  )   { return p;  }
    virtual  int  push (int f)   { return  p<c?(e[p++]=f, 1): 0;  }
    virtual  int  pop (int&f)   { return  p>0? (f=e[--p], 1): 0;  }
    STACK (int m) : e (new int[m]),  c (e? m: 0),  p (0)   {  }
    virtual  ~STACK (  ) { if (e)   { delete e;  e=0;  c=0;  p=0; }}
};
class QUEUE: public  STACK{//公有派生构成父子关系
    STACK  s;   //s用于出队列, STACK用于入队列
    int   c;           //栈的深度
public:
    virtual  int  enter (int f)
    {  int x;
       if(getp( )>=c && s.getp( )==0) while  (pop (x))  s.push (x) ;
       return   (getp( )<c) ? (push (f), 1): 0;  }
    virtual  int  leave (int&f)
    { if  (!s.getp ( ))  while (pop (f))  s.push (f) ;
       return (s.getp()) ? (s.pop (f), 1): 0;  }
    QUEUE (int m) : STACK (m) ,  s (m)  {  c=m; }
    ~QUEUE ( ) {  }  //自动成为虚析构函数
};
void main (void)   {  STACK  *p=new QUEUE (9) ;  delete  p;  }

这个是幻灯片126页的一个程序,仔细看STACK的构造函数,马光志显然想通过判断分配内存成功与否来决定把堆栈最大容纳个数设置为用户自定义数值或者0

但是我们注意到,C++构造类成员时候是按照定义顺序的,在STACK中,就是p,  c,  *e,肯定是先决定c的数值后决定e的数值,马光志企图用e初始化的结果去决定c的数值,这肯定是做不到的.

那么可能有人会问了,为什么程序能跑?

这里有两个原因,其一,现在电脑内存普遍较大,分配这么一点内存还是基本没有可能失败的.其二,大部分人使用WINDOWS+VC平台,那么此时e的初始值将为0XCDCDCDCD(MALLOC之后的填充造成)因为0XCDCDCDCD无论如何不会等于零,于是马光志的条件判断自动生效.

在此我还想告诫马光志,不要再拿你那本垃圾教材讲课,你自己凭着良心说,你那里面有几个程序是正常人写的?不要总自作聪明,不要总在课堂上写这些垃圾代码来卖弄你自己的那点可怜的知识!别以为你教的学生都是傻子.

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值