构造函数和重载的运算符执行顺序

时间:2015-06-07 14:38:10

标签: c++ constructor

我对这段代码感到很困惑。

#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();创建对象,然后该对象正在调用运算符?如果没有,请解释它是如何工作的。感谢。

2 个答案:

答案 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();

然后在这种情况下会被称为析构函数,程序会有未定义的行为,因为析构函数会被调用两次。