首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除c++练习

删除c++练习
EN

Stack Overflow用户
提问于 2016-02-26 20:00:37
回答 4查看 175关注 0票数 4

我正在做一个练习,我不明白为什么下面的代码会返回:

代码语言:javascript
复制
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: -1

f()没有什么问题,我理解这里发生的一切。但是,我不知道构造函数和析构函数是如何在g()和h()中调用的。(谢谢:)

代码:

代码语言:javascript
复制
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   ");
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-26 20:03:50

您只检测了一个构造函数,但是C++类有多个构造函数。特别是,您需要对副本构造函数进行检测,该构造函数具有如下签名:

代码语言:javascript
复制
Counted(Counted const& other);

在代码中至少调用一个语句的复制构造函数:

代码语言:javascript
复制
Counted c2 = c1;
票数 3
EN

Stack Overflow用户

发布于 2016-02-26 20:04:48

g()中,c2是用一个复制构造函数构造的(您还没有实现这个构造函数,因此它会生成一个默认编译器),但是通过您定义的析构函数销毁。

票数 2
EN

Stack Overflow用户

发布于 2016-02-26 20:06:58

在g函数中,行

代码语言:javascript
复制
Counted c1 = c1;

调用不同的构造函数:复制构造函数。因为这个构造函数没有增加nbrObj,所以当c1和c2都被解构时,它们会两次减少nbrObj。

但是,您的g函数使用了默认的构造函数和解构函数,因此对数字没有任何影响。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35660657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档