在第一个 main 中,我们将调用复制构造函数来初始化两个对象 c 和 d。然后我们将调用我类中的第一个 = 运算符,然后为两个对象调用两次析构函数,输出为 I4I5c5d5d5
对于第二个 main,我们调用默认构造函数,然后调用 5 的构造函数的拷贝,然后调用我类中的第二个运算符,在第二个运算符结束时直接调用析构函数。
我不明白为什么在第一个 operator= 中使用运算符后不调用析构函数,为什么在第二个 operator= 中使用第二个运算符后立即调用析构函数。
#include <iostream>
using namespace std;
class C {
int i;
public:
C() : i(0) { cout << "D" << i; }
C(int _i) : i(_i) { cout << "I" << i; }
C(const C& _c) : i(_c.i) { cout << "C" << i; }
C& operator= ( const C& _c) { i = _c.i; cout << "c" << i; return *this; }
C(C&& _c) : i(_c.i) { cout << "M" << i; _c.i = 0; }
C& operator= (C&& _c) { i = _c.i; cout << "m" << i; _c.i = 0;
return *this; }
~C() { cout << "d" << i; }
};
int main() {
C c = 4;
C d = 5;
c = d;
}
/* int main() {
C c;
c = 5;
} */
最佳答案
在 c = 5;
行中,没有任何赋值运算符接受 int
可用,因此临时 C(5)
将被创建,然后在作业中使用。
这个临时文件将在语句结束时被销毁。
关于c++函数在之后立即调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50666174/