当前位置 博文首页 > liuzhen007的专栏:C++面试常见问答题看这三篇文章就够了(下)

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

    作者:[db:作者] 时间:2021-09-03 09:17

    目录

    ?

    前言

    正文


    前言

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

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

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

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

    正文

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

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

    2.?以下程序

    main()  
    {  
        int m=12,n=34;    
        printf("%d%d",m++,++n);    
        printf("%d%d\n",n++,++m);  
    } 

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

    答案: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.?程序段的执行结果是:

    #include <iostream>
    using namespace std;
     
    void fun1(int &x) {
        x++;
    }
     
    void fun2(int x) {
        x++;
    }
     
    int main() {
        int abc = 13;
        fun1(abc);
        printf("%d\n", abc);
        fun2(abc);
        printf("%d\n", abc);
    }

    答案:14,14

    6. 以下程序

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

    输出结果?

    答案:Beijing。

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

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

    答案:2,5。

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

    class C
    {
    public:
        char a;
        static char b;
        void *p;
        static int *c;
        virtual void func1();
        virtual void func2();
    };
    
    

    那么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)?

    For a CPU with 32-bit addresses and 32-bit integers, we have the following code:
    
    typedef struct data_ {
        int a[10];
    } data_t;
     
    typedef struct descriptor_ {
        data_t *ptr;
        char data[0];
    } desc_t;

    答案:4。

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

    int main() {
        int *k[10][30];
        printf(""%d\n"", sizeof(k));
        return 0;
    }

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

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

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

    计算

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

    答案:22, 4, 4, 4。

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

    struct A1{
        virtual ~A1(){}
    };
    struct A2{
        virtual ~A2(){}
    };
    struct B1 : A1, A2{};
    int main()
    {
        B1 d;
        A1* pb1 = &d;
        A2* pb2 = dynamic_cast<A2*>(pb1);  //L1
        A2* pb22 = static_cast<A2*>(pb1);  //L2
        return 0;
    }

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

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

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

    答案:异常。

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

    #include<stdio.h>
    class A
    {
        public:
          virtual void f(){}
        public :
           A()
           {
               f();
            }
    };
    class B1:public A()
    {
        private:
            char *_s;
        public:
            B1()
            {
                _s=new char[1024];
            }
        private:
            void f()
            {
                delete _s[];
                _s=NULL;
            }
    }
    class B2:public A
    {
        private:
        int * _m;
        public:
            B2()
            {
                _m=new int(2016);
            }
        private:
            virtual void f()
            {
                delete _m;
                _m=NULL;
            }
    }
    int main()
    {
        A*a1=new B();
        A*a2=new C;
        delete a1;
        delete a2;
        return 0;
    }

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

    line12 ? ? ?classB1:publicA

    line24 ? ? delete[] _s;

    line27 ? ? };

    line43 ? ? };

    line46 ? ? A*a1 = new B1();

    line47 ? ? A*a2 = new B2;

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

    #include <iostream>
    using namespace std;
    class D{
        int d;
    public: 
        D(int x=1):d(x){}
        ~D(){cout<<"D";}}; 
    int main(){ 
        D d[]={_____________};
        D* p=new D[2];
        delete[]p;
        return 0; 
    }

    答案:

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

    或者

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

    ?

    ?

    ?

    cs
    下一篇:没有了