我对这段代码感到很困惑。
#include <iostream>
using namespace std;
class A{
public:
A(){
cout << "Constructor" << endl;
}
~A(){
cout << "Destructor" << endl;
}
void operator ~(){
cout << "\nOverloaded Operator";
}
};
int main(){
~A();
cout << "\nBefore End";
}
输出
Constructor
Overloaded OperatorDestructor
Before End
我想问一下,在~A();
代码行构造函数A();
创建对象,然后该对象正在调用运算符?如果没有,请解释它是如何工作的。感谢。
答案 0 :(得分:5)
@
创建一个类型为A()
的临时文件,您可以在其上调用A
,并在该行末尾销毁该文件。
析构函数是一个特殊的成员函数 - 但它仍然是一个成员函数。因此,如果你要直接调用它 - 这应该只在罕见的特殊情况下完成 - 它仍然必须在一个对象上调用。例如,此示例将调用析构函数:
operator~()
然而,它会摧毁A().~A();
临时两次,这很糟糕。
答案 1 :(得分:3)
在大括号
中将〜A()的调用更加明显int main(){
{
~A();
}
cout << "\nBefore End";
}
因此,首先会创建一个调用默认构造函数的临时对象。然后将会调用成员函数operator ~
,在完成语句后,将会调用析构函数。
此次电话
~A();
相当于
A().operator ~();
如果您将以下列方式编写
A().A::~A();
或
A().~A();
然后在这种情况下会被称为析构函数,程序会有未定义的行为,因为析构函数会被调用两次。