C++常見筆試題

Q1. 下面程序的輸出結果是?

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

        ~A(){
            cout << "~A()" << endl;
        }
        
        virtual void fun(){
            cout << "A:fun()" << endl;
        }
};

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

        virtual void fun(){
            cout << "B:fun()" << endl;
        }
};

class C: public B{
    public:
        C(){
            cout << "C()" << endl;
        }

        ~C(){
            cout << "~C()" << endl;
        }
private:
        virtual void fun(){
            cout << "C:fun()" << endl;
        }
};


int main()
{
    B b = B();
    B *c = new C();
    c->fun();
    delete c;
}
A1.參考答案:

A()
B()
A()
B()
C()
C:fun()
~B()
~A()
~B()
~A()

Q2:設計一個只能在堆內存上實例化的類和一個只能在棧內存上實例化的類,否則出現編譯錯誤。

A2:不能在棧上實例化,而只能在堆上實例化,可以將析構函數私有化,防止自動調用析構函數,必須手動調用;

class CHeapOnly
{
public:
    CHeapOnly()
    {
        cout << "Constructor of CHeapOnly!" << endl;
    }

    void Destroy() const
    {
        delete this;
    }

private:
    ~CHeapOnly()
    {
        cout << "Destructor of CHeapOnly!" << endl;
    }
};
只能在棧內存上實例化,不能在堆內存上實例化,將new和delete操作符私有化。

class CStackOnly
{
public:
    CStackOnly()
    {
        cout << "Constructor of CStackOnly!" << endl;
    }

    ~CStackOnly()
    {
        cout << "Destrucotr of CStackOnly!" << endl;
    }

private:
    void* operator new(size_t size)
    {
    }

    void operator delete(void * ptr)
    {
    }
};




發佈了102 篇原創文章 · 獲贊 8 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章