C++;对象生存期和调用的析构函数 我试图理解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; }
因此,我的问题是:C++;对象生存期和调用的析构函数 我试图理解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; },c++,object-lifetime,C++,Object Lifetime,因此,我的问题是: 为什么在语句v[0]=bar中不调用复制构造函数 为什么最初称为bar的对象的析构函数会被调用两次(即在输出中看到两次~Foo():2) 有人能帮我吗 多谢各位 调用赋值运算符是因为v[0]处的对象已构造。自动赋值运算符将执行所有成员的浅层复制,这些成员 由于自动赋值运算符的浅拷贝,~Foo():2似乎会出现两次,因为两个对象包含值为2的成员x 调用赋值运算符是因为v[0]处的对象已构造。自动赋值运算符将执行所有成员的浅层复制,这些成员 由于自动赋值运算符的浅拷贝,~Foo(
v[0]=bar
中不调用复制构造函数~Foo():2
)在
v[0]=巴时代码>调用隐式定义的复制赋值运算符(Foo&operator=(const Foo&);
)。它将x
(2)从bar
复制到v[0]
。因此,当调用bar
和v[0]
的析构函数时,您会看到2
代码>调用隐式定义的复制赋值运算符(Foo&operator=(const Foo&);
)。它将x
(2)从bar
复制到v[0]
。因此,当调用bar
和v[0]
的析构函数时,您会看到2
。Try正在使用赋值运算符,因此2出现两次Try正在使用赋值运算符,因此2出现两次v[0]=bar
不是复制构造,而是赋值(您没有重载). 首先,我要说的是,您需要将“nextX”设置为一个静态变量,这样它就不会对每个新对象重置为0。看看会发生什么。波尔卡舞者nextX不在类中,因此不会重置,它已经是全局静态的。v[0]=bar
不是复制构造,而是赋值(您没有重载)。首先,我要说的是,您需要将“nextX”设置为一个静态变量,这样它就不会对每个新对象重置为0。看看会发生什么。波尔卡舞者nextX不在类中,因此不会重置,它已经是全局静态的。
Foo(): 0
-----------------
Foo(): 1
-----------------
Foo(): 2
-----------------
-----------------
~Foo(): 2
~Foo(): 2
~Foo(): 0