c++函数在之后立即调用析构函数

标签 c++ c++11

在第一个 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/

相关文章:

c++ - 我可以将 C++ 代码(或用 C++ 编写的库)与混合移动应用程序代码混合使用吗?

c++ - 访问说明符和右值引用

c++ - 访问孙类中基类的 protected 成员

c++ - 可按参数类型更改 "return type template"

c++ - 自动协变类推导

c++ - 是否可以通过标签编号引用 QTabWidget 的各个标签?

c++ - 模板参数是模板的模板类特化

c++ - 多个字符串存储在不同的变量 C++ 中

c++ - 使用 Qt4 和 C++ 在 Windows XP 上进行并行端口输出

c++ - 将构造函数中动态分配的数组分配给唯一的智能指针成员变量