50分急求1个c++习题的解答

来源:百度知道 编辑:UC知道 时间:2024/06/01 02:05:31
1:
#include <iostream>
using namespace std;
class Obj
{
static int i;
public:
Obj(){i++;}
~Obj(){i--;}
static int getVal(){return i;}
};
int Obj::i=0;
void f(){Obj ob2;cout<<ob2.getVal();}
int main()
{
Obj ob1; //调用构造函数加上1
f(); //调用构造函数加上1
Obj *ob3=new Obj;//????答案说这里不调用构造函数
cout<<ob3->getVal();
delete ob3;cout<<Obj::getVal(); //调用析构函数减去1
return 0;
}
结果:221

2:
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass(){count++;}
~MyClass(){count--;}
static int getCount(){return count;}
private:
static int count;
};

int MyClass::count=0;
int main()
{
MyClass obj; //调用构造函数加上1
cout<<obj.getCount();
MyClass *ptr=new MyClass;//????答案确说这里调用构造函数
cout<<MyClass::getCount();

Obj *ob3=new Obj;这条语句肯定执行构造函数,但是第一题答案为什么是221呢?主要问题在void f(){Obj ob2;cout<<ob2.getVal();} ,调用完f函数后,
ob2是局部变量要释放,所以执行了析构函数使得i值减1,当Ojb *ob3=new Ojb时,执行构造函数使得i值增1,所以答案是221,而不是232

这两个题目中都用了<类名> *ob3=new <类名> ;
这个东西什么意思?有什么用?为什么这两个题目用同样格式,
A:这样的格式是为了定义一个指针类型的对象,用new在堆上分配一个<类名>类型的对象

但最后答案不一样了?
A:关键你要知道什么时候类对象去调用构造函数。
这点是最主要的,
1.定义对象时,
2.创建临时对象时
3.生命周期结束就调析构函数

申请新空间。。。。