【发布时间】:2018-06-03 12:01:56
【问题描述】:
在第一个 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;
} */
【问题讨论】:
-
你说
first main和second main,这两个是什么意思? main 中的第一行和第二行代码还是 main 的两个不同版本? -
如果输出是
I4I5c5d5d5,那么复制构造函数没有被调用。