C++筆試題

1.下面代碼的輸出是什麼?

class A  
{  
public:  
    A()  {     }  
    ~A() {    cout<<"~A"<<endl;   }  
};  

class B:public A  
{  
    public:  
        B(A &a):_a(a)  
        {  

        }  
        ~B()  
        {  
            cout<<"~B"<<endl;  
        }  
    private:  
        A _a;  
    };  

int main(void)  
 {  
        A a;       //很簡單,定義a的時候調用了一次構造函數  
        B b(a); 
}

A.~B
B.~B ~A
C.~B ~A ~A
D.~B ~A ~A ~A

要想搞明白該問題,需要理解基類構造析構函數、子類構造析構函數和子類成員變量構造析構函數的調用順序。
對於構造函數:基類構造函數 > 子類成員變量構造函數 > 子類構造函數
對於析構函數:子類析構函數 > 子類成員變量析構函數 > 基類析構函數
可以看出構造函數的調用過程和析構函數的調用過程正好相反。

main函數中首先構造變量a,然後是b。在構造b時首先調用b的基類A的構造函數,然後調用b中成員變量_a的構造函數,最後調用b的構造函數。
main函數調用結束返回時,變量的釋放順序跟變量的構造順序正好相反。首先釋放變量b,然後是變量a。
在釋放變量b時,首先調用b的析構函數,然後析構變量b的成員_a,析構_a時調用_a的析構函數。再調用b的基類的析構函數。
然後是釋放變量a,調用a的析構函數。

本例子中應該將A的析構函數更改爲virtual的,防止使用多態機制時出現子類對象無法釋放的情況,本例子中沒有用到多態機制,不存在該問題。

最開始析構b,~B,這個是沒有爭議的。
接着是析構b的成員變量_a,所以是~A
接着是b的parent class(基類)的~A
最後纔是a的析構~A
選D


2.下面有關malloc和new,說法錯誤的是?
A.new 建立的是一個對象, malloc分配的是一塊內存.
B.new 初始化對象,調用對象的構造函數,對應的delete調用相應的析構函數,malloc僅僅分配內存,free僅僅回收內存
C.new和malloc都是保留字,不需要頭文件支持
D.new和malloc都可用於申請動態內存和釋放內存,new是一個操作符,malloc是是一個函數

new/delete都是要分兩步操作的:new分配內存,並且調用對象的構造函數初始化一個對象;delete調用相應的析構函數,然後釋放內存
malloc/free只是分配內存/回收內存, 所以A、B對;
malloc需要頭文件”stdlib.h”或者”malloc.h” C錯;
new/delete都是內建的操作符,而malloc是一個函數,其函數原型是:

void *malloc(unsigned int num_bytes);

所以選C

3.下面有關類的靜態成員和非靜態成員,說法錯誤的是?
靜態成員存在於內存,非靜態成員需要實例化纔會分配內存
非靜態成員可以直接訪問類中靜態的成員
靜態成員能訪問非靜態的成員
非靜態成員的生存期決定於該類的生存期,而靜態成員則不存在生存期的概念

答案:C
靜態成員屬於類的,非靜態成員屬於對象的
非靜態成員可以訪問靜態成員時因爲類必定優先於對象而存在
反過來,靜態成員不能訪問非靜態成員

4.在32位小端的機器上,如下代碼輸出是什麼:

char array[12] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08};     
 short *pshort = (short *)array;     
 int *pint = (int *)array;     
 int64 *pint64 = (int64 *)array;     
 printf("0x%x , 0x%x , 0x%x , 0x%x", *pshort , *(pshort+2) , *pint64 , *(pint+2));

A.0x201 , 0x403 , 0x807060504030201 , 0x0
B.0x201 , 0x605 , 0x807060504030201 , 0x0
C.0x201 , 0x605 , 0x4030201 , 0x8070605
D.0x102 , 0x506 , 0x102030405060708 , 0x0

小端機器的數據高位字節放在高地址,低位字節放在低地址。x86結構爲小端模式。
pshort佔用2個字節,在內存中的16進製爲0x01 0x02,對應的16進制數爲0x0201。
pshort + 2指向array數組的下標爲4的元素,佔用2個字節,在內存中的16進製爲0x05 0x06,對應的16進制數爲0x0605。
pint64的int64類型不確定,但根據名字可以看出佔用8個字節,對應的16進制形式爲0x807060504030201。
pint + 2佔用4個字節,指向的array數組的下標爲8的元素,8-11個元素沒有指定數組的初始化值,默認爲0,因此*(pint + 2)對應的16進製爲0。

選B

5.請問i的值是:

int main()
{
    unsigned char i = 1;
    i -= 4;
    printf(“the value of i is: % d”, i);
}

A.253
B.254
C.255
D.256

unsigned char 總共8位,1-4 = -3,-3用8位二進制表示就是11111101(因爲向前擴展最高位是多少就填多少,這裏是1)因爲是無符號數,所以最高位的1不做符號位,作爲數值爲,11111101對應的十進制數爲253

6.下述程序的輸出是____

#include<stdio.h>

int main()
{
    static char *s[] = {"black", "white", "pink", "violet"};
    char **ptr[] = {s+3, s+2, s+1, s}, ***p;
    p = ptr;
    ++p;
    printf("%s", **p+1);
    return 0;
}

A.ink
B.pink
C.white
D.hite
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章