【筆試題精選】_4

下面代碼是否有錯誤?若是有錯,錯在哪裏?
struct Test
{
    Test() {};
    Test(int i){}
    void func(){}
};

int main()
{
    Test t1(1);
    Test t2();
    t1.func();
    t2.func();
}

答案:ios

1. Test t2();  ==>  Test t2;
warning: empty parentheses interpreted as a function declaration

2. t2.func();  ==>
error: base of member reference is a function; perhaps you meant to call it with no arguments?

3. int main() 缺乏返回值
C++ 編譯器須要兼容 C 編譯器,編譯過現有的 C 代碼,所以沒有報錯

下面的代碼輸出什麼?爲何?
class Test
{
private:
    int m_i;
    int m_j;
public:
    Test(int v) : m_j(v), m_i(m_j)
    {
    }
    
    int getI()
    {
        return m_i;
    }
    
    int getJ()
    {
        return m_j;
    }
};

int main()
{
    Test t1(1);
    Test t2(2);
    
    cout << t1.getI() << " " << t1.getJ() << endl;
    cout << t2.getI() << " " << t2.getJ() << endl;
}

輸出:編程

隨機數, 1
隨機數, 2

說明:segmentfault

成員的初始化順序與成員的聲明順序相同
成員的初始化順序與初始化列表中的位置無關

本題中成員變量在未初始化前存儲的是隨機數

參考:
初始化列表的使用數組


下面的代碼輸出什麼?爲何?
#include <iostream>

using namespace std;

class Test
{
private:
    int m_i;
    int m_j;
public:
    Test()
    {
        cout << "Test()" << endl;
    }
    
    Test(int v)
    {
        cout << "Test(int v)" << endl;
    } 
    
    Test(const Test& v)
    {
        cout << "Test(const Test& v)" << endl;
    }
    
    ~Test()
    {
        cout << "~Test()" << endl;
    }
};

Test Play(Test t)
{
    return t;
}

int main()
{
    Test m_t = Play(5);
}

輸出:ide

g++ test.cpp -fno-elide-constructors 禁止編譯器作任何優化

Test(int v)
Test(const Test& v)
Test(const Test& v)
Test(const Test& v)
~Test()
~Test()
~Test()
~Test()
Which virtual fucntion re-declaration of the Derived class are correct ?
A. Base* Base::copy(Base*);
   Base* Derived::copy(Derived*);

B. Base* Base::copy(Base*);
   Derived* Derived::copy(Base*);

C. int Base::count();
   int Derived::count();

D. void Base::func(Base*)const;
   void Derived::func(Base*);

答案:【C】
說明:函數

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

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

class Child:public Base
{
public:
    void func()
    {
        cout << "Child::func()" << endl;
    }
};

int main()
{
    Base* pb = new Base();
    pb->func();
    Child* pc = (Child*)pb;  // 注意這裏!!!
    pc->func();
    delete pc;
    
    pb = new Child();
    pb->func();
    pc = (Child*)pb;
    pc->func();
}

輸出:優化

cout << "Base::func()" << endl;   // 正常調用
cout << "Base::func()" << endl;
cout << "Child::func()" << endl;  // 多態調用
cout << "Child::func()" << endl;  // 正常調用

說明:spa

Child* pc = (Child*)pb;  ==> 子類對象指針指向父類對象,這是及其危險的!!

但是爲何沒有發生程序錯誤呢?
由於有虛函數表的存在,不管是子類對象指針仍是父類對象指針指向父類對象,都會發生相同的查找過程

clipboard.png

當 func 不是虛函數時,就不會發生虛函數表的查找過程,此時必定會發生程序崩潰

參考:
C++對象模型分析指針


A C++ develoer wants to handle a static_cast<char*>() operation for the String class shown below. Which of the following options are valid declarations that will accomplish task ?
class String
{
public:
// ...
// declaration goes here
}

A. char* operator char*();
B. operator char*();
C. char* operator();
D. char* operator String();

答案:【B】code


如下兩種狀況:(1)new 一個 10 個整型變量的數組 (2)分 10 次 new 一個整型變量。 哪一個佔用的空間更大?
A. 1
B. 2
C. 同樣多
D. 沒法肯定

答案:【B】
說明:

clipboard.png


下面程序輸出什麼?
int main()
{
    int v[2][10] = 
    {
        { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
        {11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
    }
    
    int (*a)[8] = (int(*)[8])v;
    
    cout << **a << endl;
    cout << **(a + 1) << endl;
    cout << *(*a + 1) << endl;
    cout << *(a[0] + 1) << endl;
    cout << *a[1] << endl;
}

輸出:

1
9
2
2
9

參考:
多維數組和多維指針


下面的程序輸出什麼?爲何?
class Base
{
public:
    int a;
    
    Base() 
    { 
        a = 1; 
    }
    
    void println() 
    {
        cout << a << endl;
    }
};

class Child : public Base
{
public:
    int a;
    
    Child() 
    {
        a = 2;
    }
};

int main()
{
    Child c;
    c.println();
    cout << c.a << endl;
}

輸出:

1
2

說明:

c.println(); ==> 父類中的 printlin 被調用,因爲做用域, 父類中的 a 被訪問

c.a ==> 發生同名覆蓋

參考:
父子間的衝突


用 C/C++ 語言實現一個存儲整型數據的棧結構
要求實現如下功能:
1. 入棧操做 push
2. 出棧操做 pop
3. 棧大小操做 size
4. 棧中最小元素 min
class IntStack
{
private:
    list<int> m_stack;
    list<int> m_cmin;

public:
    void push(int v);
    int pop();
    int top();
    int size();
    int min();
};

void IntStack::push(int v)
{
    m_stack.push_front(v);

    if( m_cmin.size() != 0 )
    {
        if( v < m_cmin.front() )
        {
            m_cmin.push_front(v);
        }
        else
        {
            m_cmin.push_front(m_cmin.front());
        }
    }
    else
    {
        m_cmin.push_front(v);
    }
}

int IntStack::pop()
{
    int ret = m_stack.front();

    m_stack.pop_front();
    m_cmin.pop_front();

    return ret;
}

int IntStack::top()
{
    return m_stack.front();
}

int IntStack::size()
{
    return m_stack.size();
}

int IntStack::min()
{
    return m_cmin.front();
}

編程實現二叉樹的相等比較,當二叉樹每一個節點的值對應相等時,二叉樹相等,不然不相等
struct BTreeNode
{
    int v;
    BTreeNode* left;
    BTreeNode* right;
};

函數原型:
bool BTreeCompare(BTreeNode* b1, BTreeNode* b2);

深度優先:

bool BTreeCompare(BTreeNode* b1, BTreeNode* b2)
{
    bool ret = false;

    if( (b1 != NULL) && (b2 != NULL) )
    {
        ret = (b1->v == b2->v) && BTreeCompare(b1->left, b2->left) && BTreeCompare(b1->right, b2->right);
    }

    if( (b1 == NULL) && (b2 == NULL) )
    {
        ret = true;
    }

    return ret;
}

廣度優先:

bool BTreeCompareEx(BTreeNode* b1, BTreeNode* b2)
{
    bool ret = true;
    list<BTreeNode*> l1;
    list<BTreeNode*> l2;

    l1.push_back(b1);
    l2.push_back(b2);

    while( ret && l1.size() && l2.size() )
    {
        BTreeNode* n1 = l1.front();
        BTreeNode* n2 = l2.front();

        l1.pop_front();
        l2.pop_front();

        if( (n1 != NULL) && (n2 != NULL) )
        {
            ret = (n1->v == n2->v);

            l1.push_back(n1->left);
            l1.push_back(n1->right);

            l2.push_back(n1->left);
            l2.push_back(n2->right);
        }
        else if( (n1 == NULL) && (n2 != NULL) )
        {
            ret = false;
        }
        if( (n1 != NULL) && (n2 == NULL) )
        {
            ret = false;
        }
    }

    return ret && (l1.size() == 0) && (l2.size() == 0);
}
相關文章
相關標籤/搜索