华为笔试
对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




