編程題#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) 的解釋: