使用匿名临时创建对象

时间:2017-10-18 15:50:07

标签: c++ constructor copy-constructor temporary

我想知道在将匿名对象临时分配给命名对象时内部发生了什么:

#include <iostream>

class Object {
public:
  Object (void) {
    this->PrintAddress();
  }
  Object (const Object& another_object) {
    std::cout << "Copy constructor is called!\n";
  }
  ~Object (void) noexcept {}
  void PrintAddress (void) const {
    std::cout << "Object Address: " << this << '\n';
  }
};

int main (int arg_count, char* arg_vector[]) {
  // The following line:
  Object object = Object();
  object.PrintAddress();
  return 0;
}

编译并执行生成的二进制文件表明未调用复制构造函数,并且命名对象(&#39; object&#39;)和RHS临时文件具有相同的地址,这意味着它们是同一个对象。我不知何故感觉编译器将临时名称与名称相关联,因此为什么没有执行构造函数(除了在创建临时RHS时)。为了更好地了解这一点,请查看以下内容:

Object object (Object()); // Line 1
object.PrintAddress() // Line 2

请注意,尽管第1行与执行复制构造函数的对象具有相同的语法,但它的语法也类似于函数指针。注释第2行不会影响程序编译的能力,但是取消注释第2行(假设我刚创建了一个Object命名对象)会产生编译错误(可能是因为你无法在函数上执行成员函数)指针)。

很抱歉,如果这拖延了太长时间,但是当你这样做时内部会发生什么?

感谢您的时间!

0 个答案:

没有答案