CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

华为笔试

楼主cyy1981(McRain)2005-11-08 11:03:27 在 C/C++ / C++ 语言 提问

对c++中的类不懂,各位给讲一下,谢   了  
  找错误,并说明原因  
  一  
  class   c{  
  int   *m;  
  public:  
  void   clear()  
  {  
  if(m)   delete   m;  
  }  
  c(){m=new   int;}  
  ~c(){clear()};  
  }  
   
  二、  
  class   A  
  {  
  public:  
  static   void   f(A   a);  
  private:  
  int   x;  
  };  
  void   A::f(A   a)  
  {cout<<x;  
  cout<<a.x;  
   
  }  
   
  三  
  class   A{}  
  class   B:publicA{}  
  int   main()  
  {  
  A   *a=new   B;  
  delete   a;  
  return   0;  
   
  }  
  问题点数:20、回复次数:34Top

1 楼qhfu(改个名字)回复于 2005-11-08 11:18:00 得分 2

3,A应该有一个虚析构函数  
  2,静态成员函数不能引用非静态成员。  
   
  void   A::f(A   a)  
  {cout<<x;   //这里错。  
  cout<<a.x;  
  }  
  1,clear   应该设计成private,if(m)也可以省略,剩下的就是一些分号错误。Top

2 楼cyy1981(McRain)回复于 2005-11-08 11:23:02 得分 0

clear   应该设计成private  
  为什么啊Top

3 楼Echone902(阿莫)回复于 2005-11-08 12:00:39 得分 2

class   c{  
  int   *m;  
  public:  
  void   clear()  
  {  
  if(m)   delete   m;     //是不是delete的时候本来就会调用析构函数,那不是在那里调个不停了??  
  }  
  c(){m=new   int;}  
  ~c(){clear()};  
  }  
   
  Top

4 楼qhfu(改个名字)回复于 2005-11-08 12:05:23 得分 0

clear   应该设计成private  
  为什么啊  
  因为   clear函数设计应该是为了类内部函数(构析函数)调用用的,所以应该设计成为private。Top

5 楼Echone902(阿莫)回复于 2005-11-08 12:11:26 得分 0

qhfu(崩溃):能解释下我的问题么?Top

6 楼fflush(stdin)回复于 2005-11-08 12:33:25 得分 2

对于第一个补充一下,我认为崩溃讲的不是主要的方面(当然那可能的确也是一个问题),主要的问题是c既然必须要提供析构函数进行资源释放,那他就必须同时提供拷贝构造函数和重载operator   =,因为此时默认的方式已经不适用了,象题中提供的class   c的实现,在实际的使用中会出现各种各样的内存问题  
  to   Echone902(阿莫)   :  
  if(m)   delete   m;     //是不是delete的时候本来就会调用析构函数,那不是在那里调个不停了?  
  注意,这里m的类型是int*,所以当然不会调用c的析构函数Top

7 楼Echone902(阿莫)回复于 2005-11-08 12:53:32 得分 0

天~~,没看清楚~~,谢谢fflush(stdin)Top

8 楼anranxon(jack)回复于 2005-11-08 12:57:53 得分 0

问题一还是有点不太明白Top

9 楼codearts(代码艺术)回复于 2005-11-08 13:10:25 得分 0

要是clear()不是private的,则:  
   
  c   myC;  
  c.clear();  
  //析构函数。。。又调用clear(),就出错了  
   
  Top

10 楼codearts(代码艺术)回复于 2005-11-08 13:11:08 得分 0

写错了,是  
  myC.clear();  
  myC析构时又调用clear()  
  Top

11 楼qhfu(改个名字)回复于 2005-11-08 13:15:16 得分 0

fflush(stdin)   说的有道理,class中自己内存管理确实需要copy   ctor   和operator=();.Top

12 楼xlz45(xlz)回复于 2005-11-08 13:17:06 得分 0

应该是在clear()中这样写:  
    clear()  
  {  
  if(m)   delet   m;  
  m   =   NULL;  
  }  
   
  Top

13 楼waynahu(FIRE_BIRD-->涅磐)回复于 2005-11-08 13:20:05 得分 0

markTop

14 楼junhao_666()回复于 2005-11-08 14:00:13 得分 2

一,     ~c(){clear()};改为:virtual   ~c(){clear()};  
              *m是指针类型   应该初始一个值,int   *m=NULL;  
              if(m)应该改为:if(m==NULL)  
   
  二,   象qhfu(崩溃)   所说   静态成员函数不能引用非静态成员。  
   
   
  三,A里的虚构函数必须是虚的;  
   
  Top

15 楼freebird92(自由鸟儿)回复于 2005-11-08 16:01:40 得分 2

junhao_666()   (   )    
  一,     ~c(){clear()};改为:virtual   ~c(){clear()};  
              *m是指针类型   应该初始一个值,int   *m=NULL;  
              if(m)应该改为:if(m==NULL)  
   
  二,   象qhfu(崩溃)   所说   静态成员函数不能引用非静态成员。  
   
   
  三,A里的虚构函数必须是虚的;  
  -----------------------------  
  四,一定要加上操作符重载   operator   =  
  五,加上拷贝构造函数       c(c&   m_c);Top

16 楼zl0126()回复于 2005-11-08 16:44:25 得分 0

markTop

17 楼yangyzqo(欺世盗名来灌水)回复于 2005-11-08 17:31:25 得分 0

学习Top

18 楼taozai()回复于 2005-11-08 17:44:14 得分 2

对于第二和第三两个问题,qhfu(崩溃)已经解释的比较清楚。对于第一个问题我的看法是clear是否声明为private并不是关键所在。clear的实现如xlz45(xlz)所说。这里需要强调的是if(   m   )这个判断是有必要的。windows上删除空指针似乎没有错误。但是在linux下删除空指针就会出错。所以,一个好的编程规范应该是判断指针是否为空,然后才delete。  
  delete指针后,应该把指针设置为NULL,否则会出现悬浮指针。Top

19 楼niefuhua(阳光)回复于 2005-11-08 20:41:57 得分 0

没前途!Top

20 楼lxgang003(勤劳)回复于 2005-11-09 12:02:52 得分 0

那应该写成:if(!(m==NULL))Top

21 楼spiketang(唐其)回复于 2005-11-10 00:50:03 得分 0

freebird92(自由鸟儿)   前两点说得非常对,建设去网上找一下高质量编程这本书,才几个小时的文件,看看一你就差不多都会了,多看看,你就会明白很多,这些都是小问题!Top

22 楼prefish(鱼~)回复于 2005-11-10 07:47:02 得分 0

留名关注~~~Top

23 楼avvcdwww()回复于 2005-11-10 08:59:41 得分 0

路过Top

24 楼conquer2004(狗样年华)回复于 2005-11-10 20:03:33 得分 0

我去应聘软件工程师,结果考完出来和同学商量了一下才知道给我的是硬件工程师的卷子……  
  那是在三天前的事。Top

25 楼Johnny_de(是的,当时就是这样的!)回复于 2005-11-10 23:28:48 得分 0

对于第三个问题,错在不应该用delete   a来析构对象,在C++中只有自己用new动态分配的对象才应该用delete析构,其他的会在退出函数块的时候自动析构.Top

26 楼Johnny_de(是的,当时就是这样的!)回复于 2005-11-10 23:33:44 得分 0

xlz45(xlz)   (   )   信誉:100    
  应该是在clear()中这样写:  
    clear()  
  {  
  if(m)   delet   m;  
  m   =   NULL;  
  }  
  -----------------------------------------  
  你那不是瞎说八道吗?!指针都给析构掉了,你还去指什么空啊.Top

27 楼goldenrains()回复于 2005-11-10 23:51:35 得分 0

xlz45(xlz)   (   )   信誉:100    
  应该是在clear()中这样写:  
    clear()  
  {  
  if(m)   delet   m;  
  m   =   NULL;  
  }  
  -----------------------------------------  
  你那不是瞎说八道吗?!指针都给析构掉了,你还去指什么空啊.  
   
  -------------------------------------------------------  
  释放掉的是指针所指空间,指针本身是仍然在的,对吧?Top

28 楼AAAAAANWJ(阿A)回复于 2005-11-11 08:14:33 得分 0

大家还是好好学学C,再来发言吧。Top

29 楼csucdl(csucdl)回复于 2005-11-11 08:51:43 得分 2

to   Johnny_de(是的,当时就是这样的!)    
  你错了,指针所指向的内存单元释放了,这个指针还是指向该内存空间的,就是野指针  
  必须将该指针赋为NULL值,既不指向任何内存单元  
  第一道题出错的原因正在此,  
  考虑问题请想清楚点再说,否则会被同行不齿的Top

30 楼csucdl(csucdl)回复于 2005-11-11 08:58:20 得分 0

第二题  
  类的静态成员函数不应该调用非静态成员变量  
  另外参数有问题,类型未定义  
  改为  
  static   void   f(A   &a);  
  第三题  
  a所指对象的内存空间没有完全被释放,类A中的析构函数应该声明为virtual类型的  
  Top

31 楼xy_589(抑扬飞舞)回复于 2005-11-11 16:04:44 得分 0

xlz45(xlz)   (   )   信誉:100    
  应该是在clear()中这样写:  
    clear()  
  {  
  if(m)   delet   m;  
  m   =   NULL;  
  }  
  -----------------------------------------  
  你那不是瞎说八道吗?!指针都给析构掉了,你还去指什么空啊.  
   
  -----------------------  
  内存释放掉了,指针变量还在,当然要复值城NULLTop

32 楼sinall()回复于 2005-11-11 16:20:09 得分 2

1、  
  1)无拷贝构造函数、赋值函数。  
  2)clear不要public  
  3)delete后m=0;  
  2、静态函数无this指针,cout<<x;错误  
  3、A应该又虚析构函数。  
  Top

33 楼oosky2004(我要好东西)回复于 2005-11-11 16:26:18 得分 2

xlz45(xlz)   (   )   信誉:100    
  应该是在clear()中这样写:  
    clear()  
  {  
  if(m)   delet   m;  
  m   =   NULL;  
  }  
  -----------------------------------------  
  你那不是瞎说八道吗?!指针都给析构掉了,你还去指什么空啊.  
   
  -------------------------------------------------------  
  释放掉的是指针所指空间,指针本身是仍然在的,对吧?  
  ----------------  
  是这样的,m指向的空间是销毁了,但是m并不等于NULL,所以一般要在这个时候把m=NULL,不然下次想这样用m的时候就会有问题了:  
  if(m==NULL)   m   =   new   int;  
  Top

34 楼myheartgon(我心永恒)回复于 2005-11-11 18:56:57 得分 2

最新的标准里面,如果delete一个空指针,标准要求抛出一个异常,所以也可以不判断是否为空!但以前的标准中,没有强制规定,所以象vc中需要判断一个被删除的指针是否为NULL!Top

相关问题

  • 3.12华为笔试 归来
  • 一道华为的笔试题
  • 华为笔试过了,面试时又出了一道题
  • 华为笔试题 关于全局变量
  • 华为笔试一般都考些什么啊
  • 这个周日去华为笔试,大家帮帮忙
  • 华为笔试的一道题,看似简单
  • 有去过华为面试挂掉的吗?遭遇华为笔试面试,我都晕了啊。
  • 华为前两天在电子科大招聘时的一个笔试题:)
  • 华为前两天在电子科大招聘时的一个笔试题:)

关键词

  • clear

得分解答快速导航

  • 帖主:cyy1981
  • qhfu
  • Echone902
  • fflush
  • junhao_666
  • freebird92
  • taozai
  • csucdl
  • sinall
  • oosky2004
  • myheartgon

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo