~~
下面这些是基础题,“高手”们飘过!!!我想一般公司对语言方面,总会变着方法考下面的这些问题。这只是出现的一种形式。有啥好题欢迎大家分享,下面这些是我自己YY的。看题的兄弟只需在自己心里作答就行,一定不要忘了几乎每题都有一个“ 为什么”。
posted on 2010-05-11 08:52 麒麟子 阅读(3766) 评论(31) 编辑 收藏 引用 所属分类: Programming
第一题编译错误。g++ 4.4.1test.cpp: In function ‘int main()’:test.cpp:17: error: cannot convert ‘B*’ to ‘A*’ in initialization 回复 更多评论
@anonymous 哦,不好意思,忘了加继承关系。现已修正,谢谢! 回复 更多评论
1、请问上面输出什么,为什么! 为啥只打出 ~A 呢。。。 回复 更多评论
@楚天清秋 明白三点就知道了。 1、虚函数 2、析构函数的调用规则和时机 3、析构函数和普通成员函数也一样,只是样子很特别。 回复 更多评论
@楚天清秋因为A没有定义虚析构函数 回复 更多评论
1 void* p = NULL; p++;2 char* q = NULL; q++;3 int* r = NULL; r++;7、上面的语句是否合法,如果合法,p ,q,r的值分别是多少。为什么!1 不合法,因为void类型没有size2 q=13 r=4 回复 更多评论
3、isFailed 的值,为什么!isFailed=true,函数参数是传值的 回复 更多评论
@北海鲲鹏 嗯,突然发现变量命名有点问题,我想你说的是对的。 回复 更多评论
@小时候可靓了 照理说析构时时先 执行自己的析构函数,然后执行父类的析构函数,如果有多继承,按照父类的声明顺序来执行析构函数。 A* p = new B; delete p; 所以应该是 A和B的析构都执行吧? 回复 更多评论
A* p = new B; delete p; ~~~~~~~~ delete p; A的指针,但实例是B的, 到底是先执行A的析构函数,还是B的析构函数。 如果是先执行A的析构函数,A的析构函数由于不是Virtual的,所以不会执行B的析构函数,这就说得通! 回复 更多评论
@楚天清秋写段代码跑一下就知道了,可以找一下关于C++类型绑定的文章 回复 更多评论
class A { public: A(){cout<<"~A"<<endl;} }; class B:public A { public: B(){cout<<"~B"<<endl;} }; main() { A* p = new B; delete p; return 0; } --------------------------------- 如果上例改成构造函数的话,应该是打印 "~A" "~B" 回复 更多评论
@楚天清秋写段代码跑一下就知道了,可以找一下关于 C++类型绑定的文章 回复 更多评论
@北海鲲鹏 谢谢,代码写了也调试过,就是不明白 A* p = new B; delete p; 为什么 先执行A的析构函数,然后B的析构就不执行了。 ------------ 如果改成 B* p = new B; delete p; 结果很显然,会打印 "~B" "~A" 回复 更多评论
第四如何做,这个不会。 回复 更多评论
析构执行是先自己再父类 但由我们是 A* p = new B; delete p; 此是delete p;实现时是 if( p != NULL) p->destructor(); 可以发现,这次调用的是A的析构。 而当我们把A的析构声明成虚函数时。。。 由虚函数调用可知,就会调用到B的析构,在B的析构中就会调用A的析构。 析构函数除了名字特殊外,和普通函数具有同样的特性。。。 那位把析构改成构造函数来实现两个都输出的,我只想说,你没有明白这题的本意!!! 回复 更多评论
第1题,只输出~A,因为不是虚析构函数。第2题,1,4,4,8第3题,北海鲲鹏的回答是对的。把指针传进去,也是按传值的。要实现题中的目标,应该用指针的指针。第5题,a=(a-abs(a))/2;第6题,不知道。第7题,北海鲲鹏的回答是对的。第8题,调用void f(int* p)成功。void f(int p[])失败。因为p[]是数组,不可能是NULL。第9题,怎么实现都行。第10题,把float在内存中的表示强制转换为int类型。 回复 更多评论
各位可以不用回复在此,因为我预计这每道题回答的字数还是有百来字的。 而回答在这里肯定打不了那么多。 所以,自已知道就行了。。。 但是,你只需问你自己。。 真的知道吗? 知道到了哪种程度。。。 希望大家越来越有兴趣去探究底细,发现那些总以为会很神秘的“幕后”。 回复 更多评论
第二题有问题,结果依赖编译器。 回复 更多评论
@坏 我又没有要你答案,你只要能知道你自已常用的那个编译器是啥值就行了。。。 回复 更多评论
@楚天清秋 所谓的静态绑定。调用函数的地址在可执行文件中直接写定(这里是A的析构函数)。无需访问虚表。 回复 更多评论
@~ 如果你有机会看到这留言,你可以说得更明白些么? 回复 更多评论
float f =1.1; int a = *(int*)&f; cout<<a<<endl; 调试了一下,并不是输出1,输出1066192077,不懂 回复 更多评论
@小熙 浮点和整形在内存存储上是不一样的,这个相当于将float指针之后的sizeof(float)的数据按整形的存储方式去读取,结果当然不会是1 回复 更多评论
- -一不小心我全做对了。。我的求职经验证明。。 如果全是这样的题目的公司,或者搬抄林锐的书的公司都是垃圾公司 回复 更多评论
@12 干,不可能说全是这种题,只可能会是其中的一道或两道。。可以看得出来,你是我所说的“高手”。 其实不仅是要看你会不会,还要看你对待事情的态度。。 回复 更多评论
7. void test(bool bf) { typedef void (*PFUNC)(void); PFUNC fu1 = f1; PFUNC fu2 = f2; int a1 = (int)(fu1); int a2 = (int)(fu2); int a3 = a1 * bf + a2 * !bf; PFUNC F = (PFUNC)a3; F(); } : ) 回复 更多评论
7. 其实后2个结果是未定义的 8. 都是对的,函数参数中的数组已经退化为指针 回复 更多评论
@啊 嗯,我也不能说你对与错,只要你在你熟知的编译环境里能验证你的答案就行。 回复 更多评论
3、isFailed 的值永远为false,即使将void _MyNew(int* p)改为void _MyNew(int* &p),因为new失败不返回NULL,而是抛异常bad_alloc。 回复 更多评论
void test(bool bf) { void(*ptr[2])() = {f2,f1}; ptr[bf](); } 回复 更多评论
Powered by: C++博客 Copyright © 麒麟子