麒麟子

~~

导航

<2010年5月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

常用链接

留言簿(12)

随笔分类

随笔档案

Friends

WebSites

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜

发几道关于C++基础知识的题,能不能做自己清楚就行。

下面这些是基础题,“高手”们飘过!!!
我想一般公司对语言方面,总会变着方法考下面的这些问题。这只是出现的一种形式。有啥好题欢迎大家分享,下面这些是我自己YY的。看题的兄弟只需在自己心里作答就行,一定不要忘了几乎每题都有一个“ 为什么”。

 1class A
 2{
 3public:
 4    ~A(){cout<<"~A"<<endl;}
 5}
;
 6
 7class B:public A
 8{
 9public:
10    ~B(){cout<<"~B"<<endl;}
11}
;
12
13A* p = new B;
14delete p;
1、请问上面输出什么,为什么!


 1class A
 2{};
 3
 4class B
 5{
 6   void f(){}
 7    int i;
 8}
;
 9
10class C
11{
12   virtual void f(){}
13}
;
14
15class D:public B,public C
16{}
17
18int n1 = sizeof(A);
19int n2 = sizeof(B);
20int n3 = sizeof(C);
21int n4 = sizeof(D);
22
2、n1  n2 n3 n4的值是多少,为什么!


 1void _MyNew(int* p)
 2{
 3  p = new int;
 4}

 5
 6int*= NULL;
 7bool isFailed = false;
 8_MyNew(p);
 9
10if(p==NULL)
11  isFailed = true;
3、isFailed 的值,为什么!


4、指针的函义(答案灵活,看理解程度)


1int f(int a)
2{
3   if(a>0)
4   
5      return 0
6   }

7   return a;
8}
5、不用分支语句或跳转语句,实现上面的分支执行的功能。


void f1(){}
void f2(){}

void test(bool bf)
{
   
if(bf)
     f1();
   
else
     f2();
}
6、要求与5题相同。


1void* p = NULL; p++;
2char* q = NULL; q++;
3int* r = NULL; r++;
7、上面的语句是否合法,如果合法,p ,q,r的值分别是多少。为什么!

1void f(int* p){}
2void f(int p[]){}
3
8、如果我使用f(NULL);调用上面的函数,哪个能成功,哪个会失败,为什么。


9、构造一个简单的栈。并将 0……9的数压栈,再逆序输出。


10、你能解释float f;   int a = *(int*)&f;这句代码的含义么?


posted on 2010-05-11 08:52 麒麟子 阅读(3769) 评论(31)  编辑 收藏 引用 所属分类: Programming

评论

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 09:26 anonymous

第一题编译错误。g++ 4.4.1
test.cpp: In function ‘int main()’:
test.cpp:17: error: cannot convert ‘B*’ to ‘A*’ in initialization
  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 09:33 小时候可靓了

@anonymous
哦,不好意思,忘了加继承关系。现已修正,谢谢!  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 10:10 楚天清秋

1、请问上面输出什么,为什么!
为啥只打出 ~A 呢。。。  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 10:14 小时候可靓了

@楚天清秋
明白三点就知道了。
1、虚函数
2、析构函数的调用规则和时机
3、析构函数和普通成员函数也一样,只是样子很特别。   回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 11:23 北海鲲鹏

@楚天清秋
因为A没有定义虚析构函数  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 11:26 北海鲲鹏

1 void* p = NULL; p++;
2 char* q = NULL; q++;
3 int* r = NULL; r++;
7、上面的语句是否合法,如果合法,p ,q,r的值分别是多少。为什么!

1 不合法,因为void类型没有size
2 q=1
3 r=4  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 11:28 北海鲲鹏

3、isFailed 的值,为什么!

isFailed=true,函数参数是传值的  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 11:46 小时候可靓了

@北海鲲鹏
嗯,突然发现变量命名有点问题,我想你说的是对的。  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 12:36 楚天清秋

@小时候可靓了
照理说析构时时先 执行自己的析构函数,然后执行父类的析构函数,如果有多继承,按照父类的声明顺序来执行析构函数。

A* p = new B;
delete p;
所以应该是
A和B的析构都执行吧?  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 12:39 楚天清秋

A* p = new B;
delete p;

~~~~~~~~
delete p;
A的指针,但实例是B的,
到底是先执行A的析构函数,还是B的析构函数。
如果是先执行A的析构函数,A的析构函数由于不是Virtual的,所以不会执行B的析构函数,这就说得通!

  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 12:46 北海鲲鹏

@楚天清秋
写段代码跑一下就知道了,可以找一下关于C++类型绑定的文章  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 12:46 楚天清秋

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"
  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 12:47 北海鲲鹏

@楚天清秋
写段代码跑一下就知道了,可以找一下关于 C++类型绑定的文章  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 12:51 楚天清秋

@北海鲲鹏
谢谢,代码写了也调试过,就是不明白

A* p = new B;
delete p;

为什么 先执行A的析构函数,然后B的析构就不执行了。

------------
如果改成
B* p = new B;
delete p;

结果很显然,会打印
"~B"
"~A"   回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 13:55 春续

第四如何做,这个不会。  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 14:01 小时候可靓了

析构执行是先自己再父类
但由我们是
A* p = new B;

delete p;

此是delete p;实现时是

if( p != NULL)
p->destructor();

可以发现,这次调用的是A的析构。

而当我们把A的析构声明成虚函数时。。。 由虚函数调用可知,就会调用到B的析构,在B的析构中就会调用A的析构。

析构函数除了名字特殊外,和普通函数具有同样的特性。。。

那位把析构改成构造函数来实现两个都输出的,我只想说,你没有明白这题的本意!!!  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 15:00 Jakcie

第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类型。

  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 15:09 小时候可靓了

各位可以不用回复在此,因为我预计这每道题回答的字数还是有百来字的。 而回答在这里肯定打不了那么多。 所以,自已知道就行了。。。 但是,你只需问你自己。。 真的知道吗? 知道到了哪种程度。。。 希望大家越来越有兴趣去探究底细,发现那些总以为会很神秘的“幕后”。  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。[未登录] 2010-05-11 18:44

第二题有问题,结果依赖编译器。  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 18:57 小时候可靓了

@坏
我又没有要你答案,你只要能知道你自已常用的那个编译器是啥值就行了。。。  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。[未登录] 2010-05-11 21:32 ~

@楚天清秋
所谓的静态绑定。调用函数的地址在可执行文件中直接写定(这里是A的析构函数)。无需访问虚表。  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-11 22:04 小时候可靓了

@~
如果你有机会看到这留言,你可以说得更明白些么?  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-12 15:14 小熙

float f =1.1;
int a = *(int*)&f;
cout<<a<<endl;
调试了一下,并不是输出1,输出1066192077,不懂  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-12 18:15 Ocean.X

@小熙
浮点和整形在内存存储上是不一样的,这个相当于将float指针之后的sizeof(float)的数据按整形的存储方式去读取,结果当然不会是1  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。[未登录] 2010-05-14 15:07 12

- -一不小心我全做对了。。
我的求职经验证明。。 如果全是这样的题目的公司,或者搬抄林锐的书的公司都是垃圾公司  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。[未登录] 2010-05-15 18:48 小时候可靓了

@12
干,不可能说全是这种题,只可能会是其中的一道或两道。。可以看得出来,你是我所说的“高手”。 其实不仅是要看你会不会,还要看你对待事情的态度。。  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-18 10:05 installB

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();
}
: )  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-22 15:39

7. 其实后2个结果是未定义的
8. 都是对的,函数参数中的数组已经退化为指针  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-05-27 00:26 小时候可靓了

@啊
嗯,我也不能说你对与错,只要你在你熟知的编译环境里能验证你的答案就行。  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。 2010-06-22 00:03 flyinghearts

3、isFailed 的值永远为false,即使将void _MyNew(int* p)改为void _MyNew(int* &p),因为new失败不返回NULL,而是抛异常bad_alloc。



  回复  更多评论   

# re: 发几道关于C++基础知识的题,能不能做自己清楚就行。[未登录] 2013-05-21 14:07 123

void test(bool bf)
{
void(*ptr[2])() = {f2,f1};
ptr[bf]();
}  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理