临时对象

参考:

Temporary Objects

c++ 临时变量问题?

临时对象的创建有如下原因:

  • 要初始化一个const引用,但是其初始化器的类型不同于引用的基础类型
  • 存储返回用户定义类型的函数返回值

    • 只有当程序不会将返回值复制到对象时,才会创建这些临时文件

      // 函数声明,使用自定义类型作为返回值
      UDT Func1();
      ...
      // 调用该函数,不接受返回值。此时编译器创建一个临时对象来保存返回值
      Func1();
      
    • 创建临时变量的更常见情况是在表达式的计算过程中,必须调用重载的运算符函数。这些重载的运算符函数返回一个用户定义的类型,该类型通常不会复制到另一个对象

      class Complex {
      
      public:
          Complex(int num) : num(num) {}
      
          Complex operator+(Complex &other) {
              return Complex{this->getNum() + other.getNum()};
          }
      
          int getNum() {
              return num;
          }
      
      private:
          int num;
      };
      
      int main() {
          Complex complex1(1), complex2(2), complex3(3);
          // complex1和complex2的加法结果被存储在一个临时对象tmp中
          // tmp再继续和complex3进行加法计算,将结果复制到result
          Complex result = complex1 + complex2 + complex3;
      
          cout << result.getNum() << endl;
      }
      
  • 将强制转换的结果存储到用户定义的类型。当给定类型的对象显式转换为用户定义的类型时,该新对象将被构造为临时对象