调用C ++对象的生命周期和析构函数

时间:2015-11-09 21:01:42

标签: c++ object-lifetime

我正在尝试理解C ++中的对象生存期。当我运行代码时:

class Foo
{
public:
    Foo();
    Foo(const Foo &old);
    ~Foo();
    int x_;
};

int nextX = 0;

Foo::Foo()
{
    cout << "Foo(): " << (x_ = nextX++) << endl;
}

Foo::Foo(const Foo &old)
{
    cout << "Foo(const Foo &old): " << (x_ = nextX++) << endl;
}

Foo::~Foo()
{
    cout << "~Foo(): "<< x_ << endl;
}

int main()
{
    Foo foo;
    cout << "-----------------" << endl;
    vector<Foo> v(1);
    cout << "-----------------" << endl;
    Foo bar;
    cout << "-----------------" << endl;
    v[0]=bar;
    cout << "-----------------" << endl;

    return 0;
}

我得到以下输出:

Foo(): 0
-----------------
Foo(): 1
-----------------
Foo(): 2
-----------------
-----------------
~Foo(): 2
~Foo(): 2
~Foo(): 0

所以,我的问题是:

  1. 为什么不在语句v[0]=bar中调用复制构造函数?
  2. 为什么最初调用bar的对象的析构函数被调用两次(即~Foo(): 2在输出中被看到两次?)
  3. 有人能帮助我吗?

    谢谢

3 个答案:

答案 0 :(得分:4)

  1. 调用赋值运算符,因为已经构造了v [0]处的对象。自动赋值运算符将执行所有成员的浅表副本......

  2. 由于自动赋值运算符的浅副本,因为两个对象包含值为2的成员_x,所以看起来~Foo():2被看到两次。

答案 1 :(得分:1)

v[0]=bar;调用隐式定义的复制赋值运算符Foo &operator=(const Foo &);)。它会将x_(2)从bar复制到v[0]。因此,当2bar的析构函数被调用时,您会看到v[0]

答案 2 :(得分:0)

尝试使用赋值运算符,因此出现两次