期末考试 编程题#10:输出指定结果二(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;虚函数继承)
2017-12-07 16:55
615 查看
编程题#10:输出指定结果二
来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
总时间限制: 1000ms 内存限制: 1024kB
描述
通过填空使得程序输出的结果符合下面的要求。
输入
不需要输入。
输出
使得程序的输出结果是:
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的派生类的对象的。
程序解答(带注释):
程序解答(带注释及验证):
有关 func(b1) 的解释:
来源: 北京大学在线程序评测系统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) 的解释:
相关文章推荐
- 期末考试 编程题#2:输出指定结果一(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 期末考试 编程题#9:人群的排序和分类(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;类的继承)
- * 期末考试 编程题#7:字符串排序(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;函数对象作参数)
- 文件操作与模板 编程题#2: 实数的输出格式(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 继承与派生 编程题#2: 魔兽世界之二:装备(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 期末考试 编程题#11:数据库内的学生信息(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;STL编写)
- 期末考试 编程题#1:输出200(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 期末考试 编程题#3:计算数列平方和(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;函数对象作参数)
- 期末考试 编程题#6:MyString(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 标准模板库 STL-1 编程题#2 List(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- * 期末考试 编程题#4:计算整数平方和(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 多态与虚函数 编程题#2(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- * 期末考试 编程题#5:计算数组的低3位之和(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;for_each用法)
- 类和对象 编程题#3(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 期末考试 编程题#8:计算整数k(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;进制转换)
- 多态与虚函数 编程题#3(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 文件操作与模板 编程题#3: 整数的输出格式(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 类和对象 编程题#2(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 标准模板库 STL-2 编程题#1(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;vector(sort)中重载 <)
- * 继承与派生 编程题#1(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)