我正在做一个练习,我不明白为什么下面的代码会返回:
Program start, before f() -- number of objects: 0
After f(), before g() -- number of objects: 0
After g(), before h() -- number of objects: -1
After h(), program end -- number of objects: -1f()没有什么问题,我理解这里发生的一切。但是,我不知道构造函数和析构函数是如何在g()和h()中调用的。(谢谢:)
代码:
class Counted {
public:
Counted();
~Counted();
static int getNbrObj();
private:
static int nbrObj;
};
int Counted::nbrObj = 0;
Counted::Counted() {
nbrObj++;
}
Counted::~Counted() {
nbrObj--;
}
int Counted::getNbrObj() {
return nbrObj;
}
void f() {
Counted c;
Counted* pc = new Counted;
delete pc;
}
void g() {
Counted c1;
Counted c2 = c1;
}
void h() {
Counted c1;
Counted c2;
c2 = c1;
}
using namespace std;
void print_nbr_objects(const string& msg) {
cout << msg << " -- number of objects: "
<< Counted::getNbrObj() << endl;
}
int main() {
print_nbr_objects("Program start, before f()");
f();
print_nbr_objects("After f(), before g() ");
g();
print_nbr_objects("After g(), before h() ");
h();
print_nbr_objects("After h(), program end ");
}发布于 2016-02-26 20:03:50
您只检测了一个构造函数,但是C++类有多个构造函数。特别是,您需要对副本构造函数进行检测,该构造函数具有如下签名:
Counted(Counted const& other);在代码中至少调用一个语句的复制构造函数:
Counted c2 = c1;发布于 2016-02-26 20:04:48
在g()中,c2是用一个复制构造函数构造的(您还没有实现这个构造函数,因此它会生成一个默认编译器),但是通过您定义的析构函数销毁。
发布于 2016-02-26 20:06:58
在g函数中,行
Counted c1 = c1;调用不同的构造函数:复制构造函数。因为这个构造函数没有增加nbrObj,所以当c1和c2都被解构时,它们会两次减少nbrObj。
但是,您的g函数使用了默认的构造函数和解构函数,因此对数字没有任何影响。
https://stackoverflow.com/questions/35660657
复制相似问题