for循环中的构造函数问题

时间:2018-12-16 16:13:57

标签: c++

假设我有一个课程 A 。我想创建几个 A 类型的对象并将其推入向量。这样做的方法很多,尤其是下面说明的两种。
第一个使用for循环,第二个不使用。

显然,它们应该是等效的,但是如果我在新对象的构造函数中打印 this ,则循环中的对象共享相同的地址。 我期望

#include <iostream>
#include <vector>

class A {
    public:
        A();
        ~A();
};


A::A() {
    std::cout << "this = " << this << std::endl;
}

A::~A() {}

int main() {

    std::vector<A> v;

    // Way 1 (with for loop)
    for (unsigned i = 1; i <= 2; i++)
        v.push_back(A());

    // WAY 2 (without for)
    v.push_back(A());
    v.push_back(A());

    return 0;
}

输出为:

this = 0x7ffe8ac35ef9     <- these two are the same
this = 0x7ffe8ac35ef9     <- 
this = 0x7ffe8ac35efa
this = 0x7ffe8ac35efb

我俯瞰什么?

1 个答案:

答案 0 :(得分:2)

在您的示例中,没有什么可以提醒您。一切正常。在循环的每次迭代中,您都会创建一个堆栈变量。由于循环的所有迭代都是相同的,因此堆栈上局部变量的地址是相同的。创建变量后,将其复制到向量中,并在变量和堆栈中(在向量中)具有两个具有不同地址的副本。退出迭代后,将销毁本地副本,但另一个副本将保存在向量中。在新的迭代中,显然将在与上一个迭代相同的地址处创建一个对象。

请注意,堆栈的使用取决于编译器的优化。例如,对于“发行”版本,您可能在所有四种情况下都获得相同的地址。在我的编译器上,我得到了

this = 008FFA63
this = 008FFA63
this = 008FFA63
this = 008FFA63