C++面试常见问答题看这三篇文章就够了(下)

举报
liuzhen007 发表于 2021/05/27 16:11:09 2021/05/27
【摘要】 目录   前言 正文 前言 《C++面试常见问答题看这三篇文章就够了》的上篇和中篇主要是理论知识的问答,下篇的重点则是代码相关的问答题类型。 《C++面试常见问答题看这三篇文章就够了(上)》 《C++面试常见问答题看这三篇文章就够了(中)》 《C++面试常见问答题看这三篇文章就够了(下)》(本文) 正文 1. 代码int i=3;i&...

目录

 

前言

正文


前言

《C++面试常见问答题看这三篇文章就够了》的上篇和中篇主要是理论知识的问答,下篇的重点则是代码相关的问答题类型。

《C++面试常见问答题看这三篇文章就够了(上)》

《C++面试常见问答题看这三篇文章就够了(中)》

《C++面试常见问答题看这三篇文章就够了(下)》(本文)

正文

1. 代码int i=3;i<<=4;i的值等于多少?

答案:110000(二进制)、48。

2. 以下程序


  
  1. main()
  2. {
  3. int m=12,n=34;
  4. printf("%d%d",m++,++n);
  5. printf("%d%d\n",n++,++m);
  6. }

程序运行后的输出结果是()

答案:12353514。

3. 在gcc环境下,已知数组int arr[5]={1,2,3,4,5};则*(*(&arr+1)-1)的结果是什么?

答案:5,分析:& 是取地址符, &arr 代表整个数组,它的步长是整个数组所占的字节数, &arr 的类型是 int (*)[5] ,所以 &arr+1 指向数组 arr 最后一个元素的下一个地址, *(&arr+1)-1 则是指向 arr 最后的元素,所以 *(*(&arr+1)-1) 的值是 5 。

4. 若有说明:int i, j=2,*p=&i;,则能完成 i=j 赋值功能的语句是()。

答案:*p = *&j; 或者 *p = j; 或者 i=j;

5. 程序段的执行结果是:


  
  1. #include <iostream>
  2. using namespace std;
  3. void fun1(int &x) {
  4. x++;
  5. }
  6. void fun2(int x) {
  7. x++;
  8. }
  9. int main() {
  10. int abc = 13;
  11. fun1(abc);
  12. printf("%d\n", abc);
  13. fun2(abc);
  14. printf("%d\n", abc);
  15. }

答案:14,14

6. 以下程序


  
  1. main() {
  2. char
  3. str[][10]={"China","Beijing"},*p=str;
  4. printf("%s\n",p+10);
  5. }

输出结果?

答案:Beijing。

7. 下面程序的输出结果是( )


  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int intArray[] = {1, 2, 3, 4, 5};
  5. int *p = (int *)(&intArray+1);
  6. printf("%d,%d",*(intArray+1),*(p-1));
  7. return 0;
  8. }

答案:2,5。

8. 在64位系统中,有如下类:


  
  1. class C
  2. {
  3. public:
  4. char a;
  5. static char b;
  6. void *p;
  7. static int *c;
  8. virtual void func1();
  9. virtual void func2();
  10. };

那么sizeof(C)的数值是()

答案:24 。分析:sizeof(类)计算的是类中存在栈中的变量的大小,而类中的b和*c都是static静态变量,存在全局区中,因此不在计算范围之内,于是只剩下char a,void *p和两个virtual虚函数,a是char类型,占用一个字节,p是指针,在64位系统的指针占用8个字节,而两个虚函数只需要一个虚函数表指针,也是八个字节,加上类中的对齐方式(char a对齐时后面补上7个字节),故答案为24。

9. What is sizeof(desc_t)?


  
  1. For a CPU with 32-bit addresses and 32-bit integers, we have the following code:
  2. typedef struct data_ {
  3. int a[10];
  4. } data_t;
  5. typedef struct descriptor_ {
  6. data_t *ptr;
  7. char data[0];
  8. } desc_t;

答案:4。

10. 在64位操作系统上,下面程序返回什么结果:


  
  1. int main() {
  2. int *k[10][30];
  3. printf(""%d\n"", sizeof(k));
  4. return 0;
  5. }

答案:2400。int *k[10][30] 声明了int型的指针数组 即数组里放的是int型的指针,8*10*30=2400,注意64位操作系统,指针占8字节;int (*k)[10][30] 这样声明的结果就是 8,这个是声明了数组指针。

11. 某32位系统下, C++程序如下所示,sizeof 的值应为?


  
  1. char str[] = “http://www.renren.com” (长度为21)
  2. char *p = str ;

计算


  
  1. sizeof (str ) = ?(1
  2. sizeof ( p ) = ?(2
  3. void Foo ( char str[100]){
  4. sizeof( str ) = ?(3
  5. }
  6. void *p = malloc( 100 );
  7. sizeof ( p ) = ?(4

答案:22, 4, 4, 4。

12. 有如下代码,编译时有会什么结果?


  
  1. struct A1{
  2. virtual ~A1(){}
  3. };
  4. struct A2{
  5. virtual ~A2(){}
  6. };
  7. struct B1 : A1, A2{};
  8. int main()
  9. {
  10. B1 d;
  11. A1* pb1 = &d;
  12. A2* pb2 = dynamic_cast<A2*>(pb1); //L1
  13. A2* pb22 = static_cast<A2*>(pb1); //L2
  14. return 0;
  15. }

答案:L1语句编译通过,L2语句编译失败。

13. 以下代码执行后,it 的数据为:


  
  1. std::list<int> temp;
  2. std::list<int>::iterator it = temp.begin();
  3. it = --it;

答案:异常。

14. 请指出下列代表有几处错误。


  
  1. #include<stdio.h>
  2. class A
  3. {
  4. public:
  5. virtual void f(){}
  6. public :
  7. A()
  8. {
  9. f();
  10. }
  11. };
  12. class B1:public A()
  13. {
  14. private:
  15. char *_s;
  16. public:
  17. B1()
  18. {
  19. _s=new char[1024];
  20. }
  21. private:
  22. void f()
  23. {
  24. delete _s[];
  25. _s=NULL;
  26. }
  27. }
  28. class B2:public A
  29. {
  30. private:
  31. int * _m;
  32. public:
  33. B2()
  34. {
  35. _m=new int(2016);
  36. }
  37. private:
  38. virtual void f()
  39. {
  40. delete _m;
  41. _m=NULL;
  42. }
  43. }
  44. int main()
  45. {
  46. A*a1=new B();
  47. A*a2=new C;
  48. delete a1;
  49. delete a2;
  50. return 0;
  51. }

答案:6处,修改后如下所示:

line12      classB1:publicA

line24     delete[] _s;

line27     };

line43     };

line46     A*a1 = new B1();

line47     A*a2 = new B2;

15. 有以下程序,程序运行的结果是DDDDD,横线处可以怎么写?


  
  1. #include <iostream>
  2. using namespace std;
  3. class D{
  4. int d;
  5. public:
  6. D(int x=1):d(x){}
  7. ~D(){cout<<"D";}};
  8. int main(){
  9. D d[]={_____________};
  10. D* p=new D[2];
  11. delete[]p;
  12. return 0;
  13. }

答案:

3,3,3 (分析:发生了隐式类型转换,从侧面说明了C++不是类型安全的语言)

或者

D(3), D(3), D(3)  (分析:这个是最好理解的)

 

 

 

文章来源: liuzhen.blog.csdn.net,作者:Data-Mining,版权归原作者所有,如需转载,请联系作者。

原文链接:liuzhen.blog.csdn.net/article/details/111464581

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。