摩托罗拉部分C++面试题,交流
我大体记得这些,有些问题是我回答之后引出的,北京这边各个部门不同会有差异,但大体这个意思
1.介绍一下STL,详细说明STL如何实现vector。
2.如果用VC开发程序,常见这么几个错误,C2001,c2005,c2011,这些错误的原因是什么。
3.继承和委派有什么分别,在决定使用继承或者委派的时候需要考虑什么。
4.指针和引用有什么分别;如果传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?
5.参数传递有几种方式;实现多态参数传递采用什么方式,如果没有使用某种方式原因是什么;
6.结合一个项目说明你怎样应用设计模式的理念。
7.介绍一下你对设计模式的理解。(这个过程中有很多很细节的问题随机问的)
8.C++和C定义结构的分别是什么。
9.构造函数可否是虚汗数,为什么?析构函数呢,可否是纯虚的呢?
10,拷贝构造函数相关问题,深拷贝,浅拷贝,临时对象等。
11.结合1个你认为比较能体现OOP思想的项目,用UML来描述。(最好这个项目继承,多态,虚函数都有体现)这个问题大概会占面试时间的一半,并且会问很多问题,一不小心可能会被问住)。
12。基类的有1个虚函数,子类还需要申明为virtual吗?为什么。
13.C也可以通过精心封装某些函数功能实现重用,那C++的类有什么优点吗,难道仅仅是为实现重用。
14.C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系。
15.为什么要引入抽象基类和纯虚函数?
16.介绍一下模板和包容器。如何实现?(也许会让你当场举例实现)
17.你如何理解MVC。简单举例来说明其应用。
18,多重继承如何消除向上继承的二义性。
大体记得就是这些,想起来会继续补充。
问题点数:0、回复次数:73Top
1 楼bm1408(向va_list学习~不用VC好多年~)回复于 2006-03-08 13:44:34 得分 0
基本不难,除了这个变态了一些~!
2.如果用VC开发程序,常见这么几个错误,C2001,c2005,c2011,这些错误的原因是什Top
2 楼Loveflys()回复于 2006-03-08 14:21:07 得分 0
不愧是大公司!!Top
3 楼csShooter(Sharp Shooter)回复于 2006-03-08 14:33:55 得分 0
markTop
4 楼LoveTrista(祈祷)回复于 2006-03-08 14:37:36 得分 0
markTop
5 楼fengfeng2003()回复于 2006-03-08 14:47:41 得分 0
问的有深度,如果都能完美回答说明他对cpp和oo有一定深度的理解了Top
6 楼lygui(梦断天台)回复于 2006-03-08 16:34:44 得分 0
嗯,问题很多很深入。我竟然不知道委派的概念,汗Top
7 楼pyrophile(豆子(天上云彩往下飘))回复于 2006-03-08 16:41:44 得分 0
同样不知道委派的概念,努力学习吧!Top
8 楼xiaojun789(笑)回复于 2006-03-08 17:26:19 得分 0
upTop
9 楼a97191(等待)回复于 2006-03-08 17:32:28 得分 0
markTop
10 楼huyc_fly()回复于 2006-03-08 17:32:30 得分 0
很多不知道,高手们回答Top
11 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-03-08 17:55:32 得分 0
markTop
12 楼suyegang(叶子)回复于 2006-03-08 18:08:00 得分 0
基础学好了应该没有问题吧Top
13 楼laofuxing(laofuxing)回复于 2006-03-08 19:10:48 得分 0
还是有一定深度的!Top
14 楼citywanderer2005(流浪狗)回复于 2006-03-08 19:22:36 得分 0
markTop
15 楼strangerryf(白痴与白痴讨论的结果一定是比白痴更为白痴的结论)回复于 2006-03-08 22:12:39 得分 0
同意一楼,问题2基本上属于哪年哪月哪日太祖说过天气好Top
16 楼sk_fault(晨光一线)回复于 2006-03-08 22:30:49 得分 0
markTop
17 楼hcj2002(流浪者·躬自厚而薄责于人 )回复于 2006-03-08 22:45:15 得分 0
2.如果用VC开发程序,常见这么几个错误,C2001,c2005,c2011,这些错误的原因是什么。
==============================================================================
晕~~
Top
18 楼clzi(楚浪子-我要变强!)回复于 2006-03-08 23:41:47 得分 0
mark
xuexiTop
19 楼noOnlyCode(不错,偶就是传说中高数上下册都考80多分的牛逼人物!)回复于 2006-03-09 04:15:06 得分 0
markTop
20 楼tiemuzh777(初始化)回复于 2006-03-09 09:05:59 得分 0
gz,
原来我这么低级Top
21 楼yangyzqo(欺世盗名来灌水)回复于 2006-03-09 09:17:58 得分 0
一个都不会,留名等高手解答Top
22 楼zfyhhp()回复于 2006-03-09 09:23:09 得分 0
学习。。。Top
23 楼oo(为了名副其实,努力学习oo技术ing)回复于 2006-03-09 09:24:15 得分 0
除了第二题,都不错,有点深度。Top
24 楼bjskyhorse()回复于 2006-03-09 09:28:43 得分 0
关于问题2:我想是我说自己常用VC编程,他们觉得那你要常常用的话,这种常见错误肯定知道原因。我当时想:你就不能说错误提示是什么,我也好分析一下,那么多错误代码,我哪记得哪个对应哪个啊。
以下回答部分问题,有的还是没有找到答案:
1.没用过STL,只是有听说过,特点是泛型,也是基于多态和模板技术。向量是可以看作是动态数组。再深的就答不出了。
2.见MSDN.
3.这是他们问的最后一个问题。我当时不知道使用中有什么差别,离开前问了他们。继承和委派差别主要是语义不同。详见《高质量C++编程》和《设计模式》第一章。
4.定义引用必须要初始化,指针不必。后面的不知道。
5.传值,传地址,传引用;多态通常使用后两个;不知道有无使用传值的。
6.略。最好能抽象层次比较高。
7.这个我觉得他当时问的有问题,C++和C定义结构没有区别,只是在定义结构类型变量的时候,C++不需要struct关键字。
9.构造函数不可是虚函数,析构函数可以是,也可以是纯虚的。见《thinking in c++》第14章
10.钱能那本《C++程序设计》有很详细的说明。
11.略。最好能体现你基类设计的比较好,多态等应用。
12.不需要。
13.应该是白盒和黑盒的区别。欢迎补充。
14.特点封装,继承,重载,多态;多态是通过虚函数和滞后联编实现。那个著名的图就不画了。他们可能会让你写几个类来说明,或者给你几个,让你描述。
15.见钱能那本《C++程序设计》,P370-P375.这里略。
16.不知道,但是《thinking in c++》有说明。
17.model,view,controler.我以改变用户输入方式不应当影响视图来说明的。
18.《thinking in c++》有说明
Top
25 楼Squall1009(钰枫)(找工作ing)回复于 2006-03-09 09:53:15 得分 0
我想知道第三题的委派的意思是组合吧?我感觉组合才是和继承在一个档次上的东西,委派算一种模式吧?Top
26 楼Dluxd()回复于 2006-03-09 09:56:29 得分 0
MARKTop
27 楼dragonzxh(河马MiaMia~柯奶奶和黑爷爷的儿子叫柯南...~)回复于 2006-03-09 10:05:23 得分 0
LINK2001....以前真的去查过.....
一.由于编码错误导致的LNK2001。
1.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。例如,
如果在C++ 源文件内声明了一变量“var1”,却试图在另一文件内以变量
“VAR1”访问该变量,将发生该错误。
2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定
义将导致LNK2001错误。
3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生
LNK2001。
4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。
5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。
静态函数和静态变量具有相同的使用范围限制。当试图从文件外部访问
任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。
函数内声明的变量(局部变量) 只能在该函数的范围内使用。
C++ 的全局常量只有静态连接性能。这不同于C,如果试图在C++的
多个文件内使用全局变量也会产生LNK2001错误。一种解决的方法是需要时在
头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种
方法是使用时给该变量赋以常数。
二.由于编译和链接的设置而造成的LNK2001
1.如果编译时使用的是/NOD(/NODEFAULTLIB)选项,程序所需要的运行
库和MFC库在连接时由编译器写入目标文件模块, 但除非在文件中明确包含
这些库名,否则这些库不会被链接进工程文件。在这种情况下使用/NOD将导
致错误LNK2001。
2.如果没有为wWinMainCRTStartup设定程序入口,在使用Unicode和MFC
时将得到“unresolved external on _WinMain@16”的LNK2001错误信息。
3.使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,
源文件中对“func”的引用,在目标文件里即对“__imp__func” 的引用。
如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行连接,将在__imp__func上发
生LNK2001;如果不使用/MD选项编译,在使用MSVCxx.LIB连接时也会发生LNK2001。
4.使用/ML选项编译时,如用LIBCMT.LIB链接会在_errno上发生LNK2001。
5.当编译调试版的应用程序时,如果采用发行版模态库进行连接也会产
生LNK2001;同样,使用调试版模态库连接发行版应用程序时也会产生相同的
问题。
6.不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可
能包含早先的版本没有的符号和说明。
7.在不同的模块使用内联和非内联的编译选项能够导致LNK2001。如果
创建C++库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头
文件里却关闭了函数内联(没有inline关键字),这时将得到该错误信息。
为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数。
8.不正确的/SUBSYSTEM或/ENTRY设置也能导致LNK2001。
Top
28 楼bjskyhorse()回复于 2006-03-09 10:11:06 得分 0
关于第三题:其实我也是作为组合理解的。不过他确实是用的委派来说的。补充:如果使用继承的话,一旦release,基类就不能再修改。委派只要接口不变,内部还可以修改。Top
29 楼quicksandj2()回复于 2006-03-09 10:25:57 得分 0
markTop
30 楼wanyong775(渔民:小小的网少年)回复于 2006-03-09 10:38:42 得分 0
markTop
31 楼bbbbcccc()回复于 2006-03-09 11:31:16 得分 0
http://valenhua.go3.icpcn.com/Top
32 楼MLiang(俺想有栋房)回复于 2006-03-09 11:33:49 得分 0
编译器错误 C2001
常数中有换行符
字符串常数不能继续到第二行,除非进行下列操作:
用反斜杠结束第一行。
用一个双引号结束第一行上的字符串,并在下一行用另一个双引号开始该字符串。
用 \n 结束第一行是不够的。例如:
printf("Hello, // error
world");
printf("Hello,\n // error
world");
printf("Hello,\ // OK
world");
printf("Hello," // OK
" world");
下一行开始处位于行继续符后的空格包含在字符串常数中。以上显示的示例都没有将换行符嵌入字符串常数中。可以按如下所示嵌入换行符:
printf("Hello,\n\
world");
printf("Hello,\
\nworld");
printf("Hello,\n"
"world");
printf("Hello,"
"\nworld");
//////////////////////////////////////////////////////////////////////////////
编译器错误 C2005
#line 应输入行号,却找到“token”
#line 指令后面必须跟行号。下面的示例生成 C2005:
// C2005.cpp
int main() {
int i = 0;
#line i // C2005
// try ...
// #line 0
}
//////////////////////////////////////////////////////////////////////////////
编译器错误 C2011
“identifier”:“type”类型重定义
该标识符已定义为 type 类型。如果多次将某个类型库导入同一个文件,也可能生成 C2011。
例如:
struct S;
union S; // Error C2011
Top
33 楼MLiang(俺想有栋房)回复于 2006-03-09 11:35:21 得分 0
上面是搜索MSDN找到的 后两个不明白,请高手们给解答一下Top
34 楼julong88((无锋之刃))回复于 2006-03-09 12:00:02 得分 0
markTop
35 楼SK_MadFrog(平凡但不平庸的人)回复于 2006-03-09 12:27:26 得分 0
多重继承上的二义性见例子:
class A{
public:
ostream &print(ostream&)const;
void highlight();
};
class B{
public:
bool onExhibit()const;
private:
bool highlight(int zoo_location);
};
calss C:public B
{
ostream &print(ostream&)const;
void dance(dance_type)const;
};
class D:public C,public A
{
void cuddle()const;
};
void main()
{
//以下调用都是二义的
C::print(ostream&)const;
A::print(ostream&)const;
}
如果在两个或多个基类中都找到了声明,则调用是二义的.
解决二义的方法是采用虚拟继承.Top
36 楼SK_MadFrog(平凡但不平庸的人)回复于 2006-03-09 12:31:17 得分 0
用虚拟基类和纯虚函数,其实是一种软件复用技术,也可以说是一种设计模式.将接口定义在虚拟基类中,将具体实现留给具体的子类去实现,体现软件的灵活性.Top
37 楼firetoucher(风焱)回复于 2006-03-09 14:33:02 得分 0
北摩,呵呵。
看来到北摩只需要把Thinking in c++和Design Pattern背熟就行了啊;)Top
38 楼september_29(RSGIS)回复于 2006-03-09 15:31:08 得分 0
太JB简单了,我会Top
39 楼september_29(RSGIS)回复于 2006-03-09 15:33:54 得分 0
不过这些C++题目真的还是蛮厉害的,基本能区分,出高手出来。但是太偏重与C++本省了,真高手,一般都有其它的一门到N门的其它实用技巧,如图像图像学,网络等等Top
40 楼laolou_1983(太阳下山我下班)回复于 2006-03-09 20:20:37 得分 0
marn And 学习Top
41 楼Ninstein(www.Ninstein.Com)回复于 2006-03-09 20:40:32 得分 0
感觉有点累累的
Top
42 楼wkoji(杨威利)回复于 2006-03-09 20:50:37 得分 0
MOTO只有应届生才笔试
招有经验的只需要和那个印度主管聊聊天即可Top
43 楼waxic(waxic)回复于 2006-03-09 20:54:11 得分 0
好题目,等答案Top
44 楼CodenameBeta(纯粹马甲)回复于 2006-03-09 21:50:37 得分 0
原来大公司的面试题目是这种类型的...
嗯 看来基础一定要过硬...Top
45 楼luvybird()回复于 2006-03-09 21:57:25 得分 0
学习ingTop
46 楼dfkjewyoldfjkleoe()回复于 2006-03-09 22:15:35 得分 0
www.source520.com 免费免注册80G源码书籍下载Top
47 楼september_29(RSGIS)回复于 2006-03-10 16:03:33 得分 0
这些题目也就这样吧,没有那么夸张,学好Cpp关键在于多体会,Top
48 楼no111(哈里路亚)回复于 2006-03-12 14:15:08 得分 0
dTop
49 楼gpuboy(3D梦工厂)回复于 2006-03-13 13:41:17 得分 0
这种题目没有多大意义。
第二题已经完全证明出题人的水平了。Top
50 楼zm_min6312(月满西楼)回复于 2006-03-13 16:37:08 得分 0
顶,还是挺有深度的。Top
51 楼manplus(魅力加加)回复于 2006-03-13 16:55:19 得分 0
出2题的人有点btTop
52 楼wofish2()回复于 2006-03-13 17:11:02 得分 0
markTop
53 楼Stefine(CSDN最菜滴猩猩)回复于 2006-03-13 18:28:02 得分 0
呵呵,关注下
打好基础蛮重要DTop
54 楼powerlly(powerlly)回复于 2006-03-13 18:33:27 得分 0
构造函数也可以是虚函数吧,在设计模式中有Single模式。它由类函数自己调用,可以控制生成对象个数。Top
55 楼luocolor1()回复于 2006-03-13 22:08:16 得分 0
markTop
56 楼howyougen(夫孝,德之本也,教之所由生也)回复于 2006-03-13 22:37:41 得分 0
9.构造函数不可是虚函数,析构函数可以是,也可以是纯虚的。见《thinking in c++》第14章
但是一般不建议把析构函数定义为纯虚函数,而且析构函数即使是纯虚的也必须要给出实现Top
57 楼unalone(阿龙)回复于 2006-03-14 10:03:52 得分 0
析构函数定义成纯虚的主要作用就是定一个只能用作基类的类型,该类型不能直接实例化,但是又没有其他合适的函数适合定义成纯虚函数,在这种情况下可以将析构函数定义成纯虚函数以将该类转化成抽象类。即便如此,还是必须为该纯虚的析构函数给出一个实现,因为编译器必须能够调用基类的析构函数。Top
58 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-15 00:30:13 得分 0
9.构造函数可否是虚汗数,为什么?析构函数呢,可否是纯虚的呢?
不能,因为C++没这样设计。能,不能Top
59 楼cuiyinjie(阿杰)回复于 2006-03-20 16:19:13 得分 0
markTop
60 楼yiyo2025(HenryKong)回复于 2006-03-22 18:55:58 得分 0
14题那张著名的图是什么?Top
61 楼ronaldoa()回复于 2006-03-22 19:48:46 得分 0
为什么没有人能够回答以下呢?
我有很多都不懂啊Top
62 楼gjianpro(#ifndef _DEBUG)回复于 2006-03-23 14:16:04 得分 0
析构函数是virtual的
构造函数不能是virtual的Top
63 楼ra_zy()回复于 2006-03-23 16:15:02 得分 0
markTop
64 楼september__29( )回复于 2006-03-23 17:22:21 得分 0
我先就第九题发标点个人看法...
------------------------------●------------------------------
9.构造函数可否是虚汗数,为什么?析构函数呢,可否是纯虚的呢?
答:构造函数决对不能是虚函数.析构函数可以是虚的,也可以纯虚的...
详细的解释如下:
1.构造函数决对不能是虚函数,原因如下
首先的要弄明白的问题是如果一个类有虚函数那么该类就有一个虚表,对不?
而且该类生成的每个对象都会有个指向该类的虚表的虚表指针...(地球人都知道啊,要你说个JB)
问题就是系统在生成该类的对象时怎样能保证每个该类的对象的虚表指针都能狗正确地指向该类正确的虚表呢?
问题是谁? 谁给该类每个对象的vptr赋予了(初始化)正确的值呢?
要知道如果vptr如果指向错误的值,那么Cpp就彻底完蛋了..我们都要下岗待业了...
如果谁能发明一种令现在世界上vptr在运行时通通为NULL的病毒,估计世界到倒对不光你我的电脑现场死机,世界就真的要倒退至少十年......搞不好,会死人,一片片的死...比如大亚湾核电站爆炸了...
是谁给vptr初试化...说白了,是构造函数....是构造函数拯救了我们..
编译后构造函数会给在我们在构造函数的所以代码前面加上初始化 vptr的代码...
而每个拥有虚函数(或者其它)的类的对象在生成时就会被系统调用了一下构造函数...(从而初始化vptr)
而虚函数的调用的方式很简单...通过对象的虚表指针找到该类的虚表...然后..通过虚表中的函数地址..然后调用(传入当前对象的地址为this指针,题外话)
好...
现在假设你连构造函数也要变成虚的.就会出现我现在要vptr了(因为我要调用一个虚函数,即便它时构造函数)
而初始化vptr的构造函数本身确需要一个已经初始化好了的vptr...
(其逻辑等同于我要准备打造一把"世界上最厉害的铁锥",但是只有这把"世界上最厉害的铁锥"才能打造出这把"世界上最厉害的铁锥",结果时我永远也不能打造出这把"世界上最厉害的铁锥")
析够函数可以为虚,原因在于调用析够函数时虚表指针已经蛮好,(如果你的类可能时基类,最好把你的析够函数定义为虚的) 纯虚不纯虚这个看你的需求啦.后面这一问必较好回答,是给前面一问打掩护的....(出题人考试的意图时很清晰的,moto的人感觉还不错)
------------------------------●------------------------------Top
65 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-03-23 18:15:34 得分 0
楼上的。你只说了用特定的虚函数机制去实现虚拟构造函数而已...不过C++完全可以用另外一套机制去实现虚拟构造函数呀,问题的重点不是在实现,而是在编译器通过构造函数得到该对象相关信息,例如在stack中占用的大小等等。
而虚拟的构造函数得到的对象如何去完成sizeof计算?别告诉我 dervied is-a base...
Top
66 楼DainelLee(披着狼皮的羊)回复于 2006-03-23 19:44:03 得分 0
呵呵, 学习中,
markTop
67 楼yiyo2025(HenryKong)回复于 2006-03-24 13:25:56 得分 0
那张著名的图到底是什么图啊?????
Top
68 楼bjskyhorse()回复于 2006-03-24 14:41:21 得分 0
就是书里面那个虚拟方法表的图.Top
69 楼jasonhc(静下心来编程)回复于 2006-03-24 15:21:53 得分 0
我也参加过笔试,感觉有些题目是有些偏。比如保护继承,根本就很少用到。这种类似于考++i和i++的题目,太偏重语言本身的细节了,不能完全的验证出一个人对语言的使用水平。
另外,多重继承的题目我也遇到过。我仔细想了一下,其实这种钻石形继承结构,只要最下面的那个子类记得重新定义了继承下来的虚函数,根本就没有二义性的问题了。所以我觉得二义性问题只出现在编译时,不影响运行时绑定。我遇到的题目就是考这种钻石形继承运行时的结果,这种情况用不用virtual继承是没有区别的。Top
70 楼yiyo2025(HenryKong)回复于 2006-03-24 20:33:09 得分 0
"而虚拟的构造函数得到的对象如何去完成sizeof计算?别告诉我 dervied is-a base..."
这句话如何理解,谁能解释一下,谢谢。Top
71 楼yiyo2025(HenryKong)回复于 2006-03-24 20:43:16 得分 0
那幅经典的图在那本书上?????Top
72 楼bjskyhorse()回复于 2006-04-05 13:08:45 得分 0
再没有人发表意见,那就过几天结了。Top
73 楼blh(当你不割肉时,你的损失只是个数字,当你割肉时,你的损失就是你的肉)回复于 2006-04-05 13:39:10 得分 0
不知道,:(Top




