【问题标题】:Recursive construction using the This pointer使用 This 指针的递归构造
【发布时间】:2015-10-28 19:53:27
【问题描述】:

此代码编译并运行。 (运行风险自负)。当它运行时,它会无休止地打印“Constr beg”,正如可以预测的那样。我的问题是,递归是创建一个对象还是多个对象?如果创建了多个对象,当'this'指针被用作构造函数参数时会发生什么?

#include <iostream>

using namespace std;

class A {
private:
    A* m_p;
public:
    A() = delete;
    A(A* m_p) {
        cout << "Constr beg" << endl;
        m_p = new A{this};
        cout << "Constr end" << endl;
    }
    ~A() {
        cout << "Destr beg" << endl;
        if (m_p != nullptr) {
            delete this;
        }
        cout << "Destr end" << endl;
    }   
};

int main()
{
    // A a(A&);
    A* pA{nullptr};
    A b(pA);

    return 0;
}

【问题讨论】:

  • 愚蠢的代码 - 任何人都无法回答这个问题

标签: c++ recursion constructor this


【解决方案1】:

我的问题是,递归是创建一个对象还是多个对象?

递归创建你的类的实例,没有任何条件来停止它。很可能会导致堆栈溢出。

【讨论】:

    【解决方案2】:

    如果创建了多个对象,当'this'指针被用作构造函数参数时会发生什么?

    你从来没有在构造函数中使用参数,那么它的值怎么可能影响任何东西呢?

    第一行 (A* pA{nullptr};) 创建一个指针并将其赋值为nullptr,因此实际上根本没有调用构造函数。考虑例如unsigned foo{0};A* pA = nullptr;

    第二行创建了一个名为“b”的类型 A 的新对象,并将 nullptr 作为参数传递给构造函数(但从未使用过)。在构造函数内部,使用了另一个 A 类型的对象,并传递了刚刚创建的 A 对象的地址(即 main() 的 'b' 的地址),它再次没有用于任何事情。因为这反过来又递归地创建了新对象,所以它可能永远不会返回;但如果是这样,则该新对象的地址将分配给参数m_p,然后在(如果)构造函数返回时将其丢弃。

    【讨论】:

    • 谢谢,我想我明白了,也许我们可以缓解反对票?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多