【筆試題精選】_3

下面的代碼輸出什麼?爲何?
#include <iostream>
#include <malloc.h>
using namespace std;
class A
{
private:
    static int c_count;
public:
    A()
    {
        c_count++;
    }
    ~A()
    {
        c_count--;
    }
    static void Count()
    {
        cout<<c_count<<endl;
    }
};
int A::c_count = 0;

int main()
{
    A* a = static_cast<A*>(malloc(sizeof(A)));
    a->Count();
    delete a;
    a->Count();
    return 0;
}

輸出:ios

0
-1

說明:編程

A* a = static_cast<A*>(malloc(sizeof(A)));  // a 僅指向堆空間中A對象大小的內存, malloc 僅負責內存申請,不會觸發構造函數的調用
a->Count();                                 // 輸出 0
delete a;                                   // 析構函數被調用 , 此時 a 成爲野指針
a->Count();                                 // 可是這裏爲何沒有運行崩潰呢?
 
由於,在C++中調用靜態成員時,只使用對象類型,而不使用具體的對象
a->Count(); ==> A::Count()

參考:
關於 new malloc free delete 的疑問segmentfault


下面的程序輸出什麼?爲何?
class A
{
public:
    virtual void test(int i)
    {
        cout<<"A::test"<<i<<endl;
    }
    void test()
    {
        cout<<"A::test"<<endl;
    }
};

class B : public A
{
public:
    void test(double i)
    {
        cout<<"B::test"<<i<<endl;
    }
};

int main()
{
    A* a = new B();
    B* b = new B();
    
    a->test(5);
    b->test(5);
    
    return 0;
}

輸出:編程語言

cout<<"A::test"<<5<<endl;  // 注意這裏的輸出,沒有發生多態行爲
cout<<"B::test"<<5<<endl;

說明:函數

多態發生的條件:發生在派生類與基類之間;函數簽名必須徹底一致;

題目中派生類與基類的同名成員函數參數列表不一樣,僅發生同名隱藏

參考:
父子間的衝突spa


下面的描述正確的是?
A. 面向對象編程須要面嚮對象語言的支持,如Java 和 C++ 等
B. 封裝,繼承和多態是面向對象的基本特徵
C. 繼承是面向對象中代碼複用的惟一方式
D. 多態的工做方式與重載相同

答案: 【B】
說明:操作系統

A. 面向對象是軟件設計思想,與編程語言無關。面嚮對象語言僅是加入了對面向對象概念的原生支持
C. 繼承,組合
D. 重載,靜態聯編,編譯器肯定調用關係,發生在同一做用域中; 多態,動態聯編,運行時肯定調用關係,發生在有繼承關係的類之間

下面的代碼輸出什麼?爲何?
class A
{
private:
    int i;
public:
    virtual void test()
    {
        cout<<"A::test"<<endl;
    }
};

class B : public A
{
private:
    int i;
public:
    void test()
    {
        cout<<"B::test"<<endl;
    }
};

void f(A* p, int len)
{
    for(int i=0; i<len; i++)
    {
        p[i].test();
    }
}

int main()
{
    B b[3];
    f(b, 3);
    
    return 0;
}

輸出:線程

cout<<"B::test"<<endl;
斷錯誤

說明:設計

1 .void test(); 將發生多態行爲,第一次打印正常輸出

2. 在題目的函數調用中,void f(A* p, int len);p 將指向子類對象

3. 指針運算時(編譯期肯定):
    Type t[N]
    t[i]  <==> *(t + i)  
    t + i <==> (unsigned int)t + i * sizeof(Type)
    
4. 指針 p 指向的類型爲 A,指針運算時的步長爲 sizeof(A)

5. class A 與 class B 爲繼承關係, 所以 sizeof(B) > Sizeof(A)

clipboard.png


下面描述正確的是?
A. 一個應用程序啓動後成爲一個進程
B. 進程是操做系統資源分配的基本單位
C. 一個進程能夠建立多個線程,每一個線程都共享進程的資源
D. 操做系統能夠在建立進程的時候不建立任何一個線程

答案:【A B C】指針


下面程序輸出什麼?爲何?
class A
{
private:
    static int i;
public:
    A()
    {
        i++;
    }
    A(const A&)
    {
        i++;
    }
    
    static void output()
    {
        cout<<i<<endl;
    }
};

A f(A& a)
{
    A aa = a;
    return a;
}
int A::i = 0;

int main()
{
    A a;
    f(a).output();
    
    return 0;
}

輸出:

i = 3

說明:

第一次 i++ : A a;
第二次 i++ : A aa = a;
第三次 i++ : return a; // a 初始化一個臨時對象用於返回

下面的程序輸出什麼?爲何?
#include <iostream>
using namespace std;

#define FUNC(a, b) a = a + b; \
b = a - b; \
a = a - b

int main()
{
    int a = 3;
    int b = 4;
    
    if(a > b) FUNC(a, b);
    
    cout<<a<<" "<<b<<endl;
}

輸出:

4 -1

說明:

宏的反作用之一,僅進行簡單的文本替換

if(a > b) FUNC(a, b); ==>
if(a > b)
    a = a + b; 
    
    b = a - b;
    a = a - b

Telnet 協議是基於下面哪一種協議開發而來的?
A. TCP
B. UDP
C. TCP and UDP
D. None of above

答案:【A】


Please choose the correct option for the ISR below:()
interrupt double service(double p)
{
    return p*p;
}
A. ISR function should not return any value, service() cannot be used as a ISR
B. ISR function should not accept any parameter, service() cannot be used as a ISR
C. Servica() is a valid ISR
D. None of above

答案:【A B】
說明:

中斷服務程序須要遵循的規則:
1. 中斷服務程序不能有返回值
2. 中斷服務程序不能有參數
3. 中斷服務程序裏面不要有浮點運算
4. 中斷服務程序中不該有 printf 等不可重入的函數

有一組整型數,其中除了 2 個數字之外的其它數字都是倆倆成對出現的,編寫程序找出這兩個不成對出現的數字。

函數原型:void search_diff(int array[], int len, int* pa, int* pb);

示例:

void search_diff(int array[], int len, int* pa, int* pb);
int a = 0;
int b = 0;
int array[] = {3, 4, 5, 5, 3, 4, 1, 6, 6, 7, 2, 8, 7, 8};

search_diff(array, sizeof(array)/sizeof(*array), &a, &b); //調用後 a,b 爲 1,2 或者 a,b 爲
2,1
int first_one_bit(unsigned int v)
{
    int ret = 0;

    while( (v != 0) && ((v & 1) == 0) )
    {
        v = v >> 1;
        ret ++;
    }

    return ret;
}

void search_diff(int array[], int len, int* pa, int* pb)
{
    if( (array != NULL) && (pa != NULL) && (pb != NULL) )
    {
        int r = 0;
        int flag = 0;

        for(int i=0; i<len; i++)
        {
            r = r ^ array[i];
        }

        flag = 1 << first_one_bit(r);

        *pa = 0;
        *pb = 0;

        for(int i=0; i<len; i++)
        {
            if( array[i] & flag )
            {
                *pa = *pa ^ array[i];
            }
            else
            {
                *pb = *pb ^ array[i];
            }
        }
    }
}

打印一個 N * N 的矩陣,從首座標(0, 0) 開始順時針一次增大。
示例: 5 * 5矩陣,其中數字 1 的座標爲(0, 0)
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
template <int N>
class SpinMatrix
{
private:
    int m_matrix[N][N];

    struct Offset
    {
        int dx;
        int dy;
    };

    bool isValid(int x, int y);

public:
    SpinMatrix();
    void run();
    void println();
    int scale();
};

template <int N>
SpinMatrix<N>::SpinMatrix()
{
    for(int i=0; i<N; i++)
    {
        for(int j=0; j<N; j++)
        {
            m_matrix[i][j] = 0;
        }
    }
}

template <int N>
bool SpinMatrix<N>::isValid(int x, int y)
{
    bool ret = true;

    ret = ret && ((0 <= x) && (x < N));
    ret = ret && ((0 <= y) && (y < N));
    ret = ret && (m_matrix[x][y] == 0);

    return ret;
}

template <int N>
void SpinMatrix<N>::run()
{
    const Offset OFFSET[] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    const int OSLEN = sizeof(OFFSET) / sizeof (*OFFSET);
    int cx = 0;
    int cy = 0;
    int cd = 0;
    int i  = 1;

    do
    {
        m_matrix[cx][cy] = i;

        if( !isValid(cx + OFFSET[cd].dx, cy + OFFSET[cd].dy) )
        {
            cd = (cd + 1) % OSLEN;
        }

        cx += OFFSET[cd].dx;
        cy += OFFSET[cd].dy;

        i++;

    }while(i <= N*N);

}

template <int N>
void SpinMatrix<N>::println()
{
    for(int i=0; i<N; i++)
    {
        for(int j=0; j<N; j++)
        {
            cout << m_matrix[i][j] << '\t';
        }
        cout << endl;
    }
    cout << endl;
}

template <int N>
int SpinMatrix<N>::scale()
{
   return N;
}
相關文章
相關標籤/搜索