理解静态成员函数和变量以及析构函数

时间:2015-10-25 07:13:12

标签: c++ destructor static-members

#include<iostream>
using namespace std;

class Test
{
public:
    static int Retr();  // Static member function
    //~Test(); // Test destructor
    Test(); // Default constructor
private:
    static int count; // Static member variable
    int i;
};

int Test::count = 0; // Initialization

int main()
{
    Test obj;

    cout << Test::Retr() << endl;
    // The result should be 1 but prints two

    return 0;
}
Test::Test() : i(1) { Retr(); }

int Test::Retr()
{
    return ++count;
}

/*
Test::~Test()
{
    count--;
}
*/

我正在练习使用静态成员函数和变量。我有一个静态成员函数,它计算并返回构造的对象数。它应该为此示例显示1,但它会显示2。我不明白为什么会这样。但是,析构函数会减少每个构造对象的作用域的计数器结束。不是吗?因此,使用析构函数的结果应为0。但是,我无法得到预期的结果。有人可以解释一下吗?

编辑了不使用析构函数的内容?解决

#include<iostream>
using namespace std;

class Test
{
public:
    static int Retr();  // Static member function
    ~Test(); // Test destructor
    Test(); // Default constructor
private:
    static int count; // Static member variable
    int i;
};

int Test::count = 0; // Initialization

int main()
{
    Test obj[2];

    cout << Test::Retr() << endl;
    // The result should be 0 because of destructor but prints 2

    return 0;
}
Test::Test() : i(1) { ++count; }

int Test::Retr()
{
    return count;
}


Test::~Test()
{
    --count;
    cout << Test::Retr() << endl;
}

3 个答案:

答案 0 :(得分:0)

创建时

    Test obj;

它调用构造函数并递增1

再次打电话

    Test::retr()

它也会增加1。

如果您想检查班级的行为,可以添加其他功能

void testFunction(){
    Test obj[2];
    std::cout << Test::Retr() << std::endl; // count became 3
}
int main(){

     testFunction();
      // Obj destructed here count became 1
     std::cout << Test::Retr() << std::endl;
     // It will again increment and count will be 2
}

答案 1 :(得分:0)

Test::Test() : i(1) { Retr(); }

创建对象后,它还会调用retr()函数。这增加了数量;再次致电retr()以显示..

你的析构函数正在工作。调用Test::Retr()来检查破坏后的计数。

Test::~Test()
{
    --count;
    cout << Test::Retr() << endl;
}

答案 2 :(得分:0)

首先,您需要了解什么是静态成员函数。

  

类的静态成员不与类的对象关联:它们是具有静态存储持续时间的独立对象或在命名空间作用域中定义的常规函数​​,在程序中只有一次。

所以你的整个程序只有一个count实例(初始化为0)

让我们看一下main函数中的代码,然后创建class Test的对象。因此调用构造函数,调用static int Retr()函数。因此count现在是1.现在,

cout << Test::Retr() << endl;

再次调用Retr(),因此它会递增count并返回该值。因此返回2。

就析构函数而言,它不会在cout之前调用。只有在obj超出范围时才会调用它,只有在main函数完成时才会调用。