期末考試 編程題#10:輸出指定結果二(Coursera 程序設計與算法 專項課程3 C++程序設計 郭煒、劉家瑛;虛函數繼承)

編程題#10:輸出指定結果二

來源: 北京大學在線程序評測系統POJ (Coursera聲明:在POJ上完成的習題將不會計入Coursera的最後成績。)

總時間限制: 1000ms 內存限制: 1024kB

描述
通過填空使得程序輸出的結果符合下面的要求。

#include <iostream>
#include <map>
using namespace std;
// 在此處補充你的代碼
int A::count = 0;
void func(B b) { }
int main()
{
        A a1(5),a2;
        cout << A::count << endl;
        B b1(4);
        cout << A::count << endl;
        func(b1);
        cout << A::count << endl;
        A * pa = new B(4);
        cout << A::count << endl;
        delete pa;
        cout << A::count << endl;
        return 0;
}

輸入
不需要輸入。

輸出
使得程序的輸出結果是:
2
3
B::destructor
A::destructor
3
4
B::destructor
A::destructor
3
B::destructor
A::destructor
A::destructor
A::destructor

樣例輸入

不需要輸入。

樣例輸出

2
3
B::destructor
A::destructor
3
4
B::destructor
A::destructor
3
B::destructor
A::destructor
A::destructor
A::destructor

提示
int A::count = 0; 這個變量是用來記錄一共有多少個類A及類A的派生類的對象的。



程序解答(帶註釋):

#include <iostream>
#include <map>
using namespace std;

// 在此處補充你的代碼
class A{
public:
    static int count;  //必須是靜態的,用來記錄一共有多少個類A及類A的派生類的對象

    A(){ count++; }
    A(int n){ count++; }

    virtual ~A(){   //析構函數(對象消亡時自動被調用)
        //count--;  此時類的對象沒有消亡,程序結束時才消亡,所以 count 的值不減少
        cout << "A::destructor" << endl;
    }

    //重載delete,使用了delete釋放某個重載了delete的類的對象空間時,先調用類的析構函數,然後再調用重載的delete函數。
    void operator delete(void* a){ count--; }
};

class B :public A{
public:
    B(int n){}  //調用派生類的構造函數之前要先調用基類的構造函數!此處默認調用的是基類的 A() 構造函數
    //B(int n):A(){}  //也可以

    ~B(){      //virtual ~B() 也可以,此處 ~B() 自動是虛的
        //count--;  此時類的對象沒有消亡,程序結束時才消亡,所以 count 的值不減少
        cout << "B::destructor" << endl;
    }
};

int A::count = 0;
void func(B b) { }
int main()
{
    A a1(5), a2;
    cout << A::count << endl;  //輸出 2
    B b1(4);
    cout << A::count << endl;  //輸出 3

    //注:這裏函數 func(b1) 作用結束後,其作用對象 b1 就會消亡! 3.2.3 講義 析構函數(對象消亡時自動被調用)
    func(b1);                  //輸出 B::destructor
                               //輸出 A::destructor

    cout << A::count << endl;  //輸出 3
    A * pa = new B(4);
    cout << A::count << endl;  //輸出 4

    delete pa;   //此處 new B(4)對象 消亡,所以 count 的值減 1
                               //輸出 B::destructor
                               //輸出 A::destructor

    cout << A::count << endl;  //輸出 3

    return 0;
}



程序解答(帶註釋及驗證):

#include <iostream>
#include <map>
using namespace std;

// 在此處補充你的代碼
class A{
public:
    static int count;  //必須是靜態的,用來記錄一共有多少個類A及類A的派生類的對象

    A(){ count++; cout << "  a()" << count << endl; }
    A(int n){ count++; cout << "  a" << count << endl; }

    virtual ~A(){   //析構函數(對象消亡時自動被調用)
        //count--;  此時類的對象沒有消亡,程序結束時才消亡,所以 count 的值不減少
        cout << "A::destructor" << endl;
    }

    //重載delete,使用了delete釋放某個重載了delete的類的對象空間時,先調用類的析構函數,然後再調用重載的delete函數。
    void operator delete(void* a){ count--; }
};

class B :public A{
public:
    B(int n){ cout << "  b" << count << endl; }  //調用派生類的構造函數之前要先調用基類的構造函數!此處默認調用的是基類的 A() 構造函數
    //B(int n):A(){}  //也可以

    ~B(){      //virtual ~B() 也可以,此處 ~B() 自動是虛的
        //count--;  此時類的對象沒有消亡,程序結束時才消亡,所以 count 的值不減少
        cout << "B::destructor" << endl;
    }
};

int A::count = 0;
void func(B b) { }
int main()
{
    A a1(5), a2;
    cout << A::count << endl;  //輸出 2
    B b1(4);
    cout << A::count << endl;  //輸出 3

    //注:這裏函數 func(b1) 作用結束後,其作用對象 b1 就會消亡! 3.2.3 講義 析構函數(對象消亡時自動被調用)
    func(b1);                  //輸出 B::destructor
                               //輸出 A::destructor

    cout << A::count << endl;  //輸出 3
    A * pa = new B(4);
    cout << A::count << endl;  //輸出 4

    delete pa;   //此處 new B(4)對象 消亡,所以 count 的值減 1
                               //輸出 B::destructor
                               //輸出 A::destructor

    cout << A::count << endl;  //輸出 3

    return 0;
}



有關 func(b1) 的解釋:
這裏寫圖片描述

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