华为面试题里有一道很不明白,望高手指点,多谢!
原题为:
下面的代码会造成什么问题?
class A
{
protected:
int a;
int b;
public:
A();
};
A::A():a(10)
{
b=a*10;
}
我看来看去,想来想去都没看出来这个类定义有什么问题,因为按类成员是按声明的顺序构造的,a肯定是先得到值10,之后才执行b=a*10的,我在VC++ 6.0上将这段代码稍微改了一下,运行后顺利输出a=10,b=100,程序如下:
#include<iostream.h>
class A
{
protected:
int a;
int b;
public:
A();
};
A::A():a(10)
{
b=a*10;
cout<<"a="<<a<<" "<<"b="<<b<<endl;
}
void main()
{
A m;
}
所以百思不得其解,还求高手指点,多谢了!
问题点数:20、回复次数:51Top
1 楼quickreport(快速报告)回复于 2006-03-09 03:24:41 得分 0
MARKTop
2 楼ilove2000me(不懂)回复于 2006-03-09 03:54:40 得分 5
没有西构函数!!
内存泄露~Top
3 楼hdt(倦怠)回复于 2006-03-09 06:03:03 得分 0
a,b 外部无法访问???
Top
4 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2006-03-09 07:59:34 得分 0
class A
{
protected:
int a;
int b;
public:
A();
};
A::A():a(10)
{
b=a*10;
}
//==========
我觉得没有问题
Top
5 楼Could(翻墙鹦鹉)回复于 2006-03-09 09:41:38 得分 0
应该没有问题。Top
6 楼qdranxin()回复于 2006-03-09 09:44:05 得分 0
同意2楼的,没有析构啊Top
7 楼shaoboailinglijun(邵波爱凌丽君)回复于 2006-03-09 09:51:33 得分 0
我觉得也没什么问题的,没析构也不会。Top
8 楼fisker0303(天塌了,地陷了,小花狗不见了.)回复于 2006-03-09 09:52:21 得分 0
class A
{
protected: // 莫非要弄成private?
int a;
int b;
public:
A();
};
A::A():a(10)
{
b=a*10;
}Top
9 楼laofuxing(laofuxing)回复于 2006-03-09 09:59:51 得分 0
我觉得也没有问题!都是内部变量,没有析够也不会造成问题,因为不会造成内存泄漏的!Top
10 楼wanyong775(渔民:小小的网少年)回复于 2006-03-09 10:13:52 得分 0
學習Top
11 楼Squall1009(钰枫)(找工作ing)回复于 2006-03-09 10:15:50 得分 0
A::A():a(10),b(100)
{
}
难道他们要这个?Top
12 楼wshcdr(dd)回复于 2006-03-09 10:32:03 得分 10
class A
{
protected:
int a;
int b;
public:
A();
};
A::A():a(10)
{
b=a*10;
}
//////////////
来猜猜吧
上面的类,是一个无用的类
首先,构造了A的实例以后,不能对实例里的成员变量进行读写的动作
其次,如果是想作为基类来使用,又没有提供可以重载的接口,还没有虚拟的析构函数Top
13 楼ydfivy(我就是一送外卖的)回复于 2006-03-09 10:32:30 得分 0
这真没看出什么问题来.
从题上看,估计是要考初始化列表.
可这么写没觉得有啥毛病.
a应该是先被初始化,然后才进行计算阶段的.Top
14 楼ydfivy(我就是一送外卖的)回复于 2006-03-09 10:34:28 得分 0
哈哈.wshcdr(dd)的话真的是很有道理.Top
15 楼ox_thedarkness()回复于 2006-03-09 10:35:21 得分 0
恩... 不过个人感觉这种题目一般都是“代码有错”,很少说这就是完整的设计的...Top
16 楼pyrophile(豆子(天上云彩往下飘))回复于 2006-03-09 10:37:52 得分 0
没有什么错误!!Top
17 楼wshcdr(dd)回复于 2006-03-09 10:40:14 得分 0
接上
作为项目的代码而言,该类没有一定的命名规范Top
18 楼zhujun(zhujun)回复于 2006-03-09 11:04:08 得分 5
我觉得应该要避免成员变量间的依赖性,就是说不应该写b = a*10;而要写b(100),这样就避免了b对a的依赖。Top
19 楼feng408(新的开始……)回复于 2006-03-09 11:16:46 得分 0
将头文件#include<iostream.h>
更改成
#include<iostream>
using namespace std;
Top
20 楼demo2(云少)回复于 2006-03-09 12:39:01 得分 0
恩,我觉得也是了,这道题要么出错了,要么就是"鸡蛋里挑骨头"了,看wshcdr说的基本上都全了,挑刺的话,就是这个类在继承的时候有问题,而且没有析构,呵呵,还有没有一定的命名规范,呵呵,真的是没法再挑了
个人觉得华为的面试也不一定就很有水平,记得看过一个帖子,华为面试有一道题:构造函数和析构函数能不能有返回值.好象社区里的朋友都说不能有,但是有个朋友的帖子里就是说华为面试人说能有的,其实我面试时也遇到这个题了,我也回答不能有,只是不知道他怎么改分的Top
21 楼lovexpshl(白浪)回复于 2006-03-09 12:44:44 得分 0
除了无效类之外,想不出其他什么问题!Top
22 楼wfongcn(wf)回复于 2006-03-09 12:52:16 得分 0
同意楼上各位仁兄意见~!Top
23 楼ox_thedarkness()回复于 2006-03-09 13:11:10 得分 0
啥?构造函数和析构函数能有返回值? 倒阿,他们是连void都不允许返回的阿Top
24 楼lookforway(looker)回复于 2006-03-09 13:45:43 得分 0
A::A():a(10),b(100)
{
}
Top
25 楼zh2817()回复于 2006-03-09 15:23:38 得分 0
没有错误Top
26 楼hsyouxishe(金笛玉洁)回复于 2006-03-09 17:47:27 得分 0
楼主没有怎么修改代码吧 你只是把这个类实现了啊
Top
27 楼BoundCecy(外号土匪)回复于 2006-03-10 00:50:13 得分 0
虽然在构造函数中不能用return返回一个值,但构造函数有返回值,它返回的是为该类的实例。Top
28 楼september_29(RSGIS)回复于 2006-03-10 10:08:22 得分 0
“虽然在构造函数中不能用return返回一个值,但构造函数有返回值,它返回的是为该类的实例。”BoundCecy(外号土匪)
说得很对,
对于华为这道题,我如果如果不放入一个大环境下考虑觉得没有问题Top
29 楼lyongx()回复于 2006-03-10 10:54:38 得分 0
a 10 是初始化
b 100是赋值
沒胡問題Top
30 楼lygui(梦断天台)回复于 2006-03-10 13:56:14 得分 0
垃圾试题。Top
31 楼Tom128(翔空)回复于 2006-03-10 15:50:04 得分 0
没问题
不过
public;
后的;应去掉.Top
32 楼goodman_2006(无极)回复于 2006-03-10 16:04:17 得分 0
没问题,不知道为什么,你们总要把一道没有问题的题,硬整出问题来Top
33 楼ox_thedarkness()回复于 2006-03-10 16:22:17 得分 0
BoundCecy(外号土匪) ( )
orz... 谁告诉你构造函数返回一个实例的? 明明是系统分配空间,然后“在这片空间上”执行构造函数。Top
34 楼bbbbcccc()回复于 2006-03-10 16:46:02 得分 0
http://valenhua.go3.icpcn.com/Top
35 楼meng19860705(梦醒无痕)回复于 2006-03-10 16:52:33 得分 0
为什么不先写公共成员啊!!Top
36 楼simulationz()回复于 2006-03-10 17:44:09 得分 0
这段代码的问题不在于它的运行结果,它和成员变量的声明和初始化的次序有关,C++成员变量的初始化尽可能使用构造函数传值,少用赋值语句。详情请参阅《effective C++》(有中文版)。《深度探索C++对象模型》也涉及这方面的内容。
Top
37 楼simulationz()回复于 2006-03-10 17:54:02 得分 0
我估计华为的考官想知道应聘者是不是对一些C++的编程常识知道不知道。用初始化还是用赋值,仅从运行结果上不一定能看出错误来。如果一个变量的初始化依赖于另一个变量(如:b=10*a)那么需要明确a一定要在b初始化之前有确定的值。现在已经做到了。代码的运行上不会有问题。Top
38 楼hctko(好好)回复于 2006-03-10 18:39:06 得分 0
a为私有函数,不能这样给直Top
39 楼xust999()回复于 2006-03-10 18:56:22 得分 0
看不出来什么问题啊
Top
40 楼Jiancash(孤鸿铩羽)回复于 2006-03-10 20:37:02 得分 0
晕!?学习。Top
41 楼wanghi(海海)回复于 2006-03-10 21:09:30 得分 0
markTop
42 楼aniven(Compile Failed)回复于 2006-03-10 22:14:05 得分 0
这种题目毫无意义,有点像脑筋急转弯,看一下就忘了它吧!Top
43 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2006-03-10 22:39:54 得分 0
的确是不能这样写:
b = a * 10;
而应该写成b = 100;
因为没有谁规定a(10)会先执行。Top
44 楼futureroad(future)回复于 2006-03-11 02:02:20 得分 0
我才刚开始学c++和vc,顺便问一下
A():a(10)
就表示A()的参数吗,怎么我们的教材上没这么提这种写法啊?
我们的教材是c++程序设计语言(2版)清华大学出版社Top
45 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2006-03-11 09:33:44 得分 0
我才刚开始学c++和vc,顺便问一下
A():a(10)
就表示A()的参数吗,怎么我们的教材上没这么提这种写法啊?
我们的教材是c++程序设计语言(2版)清华大学出版社
:a(10)就是a = 10,本来是用于给const的变量初始化的,但也可以给任何变量初始化。Top
46 楼shclhs(hello)回复于 2006-03-13 19:15:24 得分 0
如果ClassA 被继承就有问题了,因为这时候你不知道访问的是哪个 a .
Top
47 楼hsyouxishe(金笛玉洁)回复于 2006-03-13 21:09:19 得分 0
出题者给过参考答案吧Top
48 楼luocolor1()回复于 2006-03-13 22:09:31 得分 0
markTop
49 楼zhgl322(河南人)回复于 2006-03-13 22:16:00 得分 0
没有问题Top
50 楼MoonZ_Wu(木子文武)回复于 2006-03-14 13:02:53 得分 0
a和b都是int型,在a足够大的时候b的数值会溢出,产生一个异常!Top
51 楼skywoody()回复于 2006-03-14 15:37:28 得分 0
以下是我的一点猜测:
1.根据原代码,a,b无法改变,都是常数,还不如生明为const;
2.虽然没有析构函数在这里不会造成内存泄露,但ClassA里既然声明了protected级的成员
显然是准备被继承使用的,所以至少应该声明一个纯虚的析构函数以使使用多态的时候能够使用指向基类的指针顺利调用派生类的析构函数;
3.构造函数是非内联的,效率不高;
4.根据一般的编码规范,类的接口应放在类开始的位置,然后跟protected和private级的成员;
。。。。。。
其他的应该还有吧,实在想不出别的什么了
Top




