附加析构函数调用的原因?
Reason of additional destructor call?
给出的是以下简单的 class:
#include <iostream>
class Foo{
int a, b;
public:
Foo(int _a = 0, int _b = 0) : a(_a), b(_b) {
std::cout << "Foo(int, int)" << "\n";
}
Foo(const Foo& foo) : a(foo.a), b(foo.b) {
std::cout << "Foo(const Foo&)" << "\n";
}
Foo& operator=(const Foo& other) {
std::cout << "operator=(const Foo&)" << "\n";
if(this != &other){
a = other.a;
b = other.b;
}
return *this;
}
~Foo() {
std::cout << "~Foo()" << "\n";
}
Foo operator+(const Foo& other){
std::cout << "foo.operator+(const Foo&)" << "\n";
return Foo(a + other.a, b + other.b);
}
};
和主要的:
int main(){
Foo f1, f2(1, 2), f3;
std::cout << "-----------" << "\n";
f3 = f1 + f2; // (*)
std::cout << "-----------" << "\n";
return 0;
}
我使用 -std=c++11
进行编译,为了演示目的还使用了 -fno-elide-constructors
标志。输出内容为:
Foo(int, int)
Foo(int, int)
Foo(int, int)
-----------
foo.operator+(const Foo&) // (1)
Foo(int, int) // (2)
Foo(const Foo&) // (3)
~Foo() // (4)
operator=(const Foo&) // (5)
~Foo() // (6)
-----------
~Foo()
~Foo()
~Foo()
据我正确理解,f3 = f1 + f2;
(*) 行发生以下情况:
- 显然,
f1.operator+(f2)
被调用了。
- 创建了一个新的(临时)对象。让我们用
T
. 来表示它
- 由于
operator+()
函数没有return 引用,我们调用复制构造函数来构造T
的副本T2
。我们returnT2
.
- 调用析构函数以删除临时对象
T
。
- 我们调用复制赋值运算符将
T2
的所有成员赋值给f3
。
我的问题:我真的不明白 (6) 的目的是什么。为什么要额外调用析构函数,即我在这里缺少什么?
what am I missing here?
毁灭T2
.
调用了3+2个构造函数,一定也调用了3+2个析构函数!
给出的是以下简单的 class:
#include <iostream>
class Foo{
int a, b;
public:
Foo(int _a = 0, int _b = 0) : a(_a), b(_b) {
std::cout << "Foo(int, int)" << "\n";
}
Foo(const Foo& foo) : a(foo.a), b(foo.b) {
std::cout << "Foo(const Foo&)" << "\n";
}
Foo& operator=(const Foo& other) {
std::cout << "operator=(const Foo&)" << "\n";
if(this != &other){
a = other.a;
b = other.b;
}
return *this;
}
~Foo() {
std::cout << "~Foo()" << "\n";
}
Foo operator+(const Foo& other){
std::cout << "foo.operator+(const Foo&)" << "\n";
return Foo(a + other.a, b + other.b);
}
};
和主要的:
int main(){
Foo f1, f2(1, 2), f3;
std::cout << "-----------" << "\n";
f3 = f1 + f2; // (*)
std::cout << "-----------" << "\n";
return 0;
}
我使用 -std=c++11
进行编译,为了演示目的还使用了 -fno-elide-constructors
标志。输出内容为:
Foo(int, int)
Foo(int, int)
Foo(int, int)
-----------
foo.operator+(const Foo&) // (1)
Foo(int, int) // (2)
Foo(const Foo&) // (3)
~Foo() // (4)
operator=(const Foo&) // (5)
~Foo() // (6)
-----------
~Foo()
~Foo()
~Foo()
据我正确理解,f3 = f1 + f2;
(*) 行发生以下情况:
- 显然,
f1.operator+(f2)
被调用了。 - 创建了一个新的(临时)对象。让我们用
T
. 来表示它
- 由于
operator+()
函数没有return 引用,我们调用复制构造函数来构造T
的副本T2
。我们returnT2
. - 调用析构函数以删除临时对象
T
。 - 我们调用复制赋值运算符将
T2
的所有成员赋值给f3
。
我的问题:我真的不明白 (6) 的目的是什么。为什么要额外调用析构函数,即我在这里缺少什么?
what am I missing here?
毁灭T2
.
调用了3+2个构造函数,一定也调用了3+2个析构函数!