【问题标题】:Using a constructor in a function call?在函数调用中使用构造函数?
【发布时间】:2011-07-12 14:09:29
【问题描述】:

我一直在寻找一个很好的解释,为什么/为什么不使用 struct 构造函数作为函数参数是合法的。有人可以提供吗?

// Begin simple illustrative example C++ program    
#include<vector.h>

struct Item  
{  
  Item(double data, const int lead)
  : m_grid(data), m_lead(lead) {}

  double m_grid;
  int m_lead;
};

int main()
{
  double img = 0.0;
  int steps = 5;
  std::vector<Item> images;
  for (int i = 0; i < steps; i++)
  {
    img += 2.0;
    images.push_back(Item(img,i));
  }
  return 0;
}

我的印象是构造函数既没有返回类型也没有语句......

【问题讨论】:

  • 是 C++ 吗?请指定您的语言。

标签: c++ function constructor arguments


【解决方案1】:

传递给push_back 的不是构造函数或其返回值。 C++实际上使用构造函数来创建一个无名的临时对象,它只在函数调用期间存在;通常,在堆栈上。然后将其传递给push_backpush_back 将其内容复制到您的向量中。

【讨论】:

    【解决方案2】:

    这是合法的。

    你永远不会自己调用构造函数;你实际上只是声明了一个Item 类型的未命名或“临时”对象。看看当你使对象不命名时语法是如何演变的:

    Item a(img,i); // normal
    Item(img,i);   // temporary
    

    尽管看起来您像调用函数一样调用构造函数,但实际上并非如此。

    无论如何,您可以在函数参数等中将临时值用作“右值”(因为它是一个),这就是您在这里所做的。


    顺便说一句,不要使用旧的 iostream.hvector.h 标头。它们早于 1998 年。在 ISO 标准 C++ 中,您应该分别使用 iostreamvector。 C++ 中的标准头文件不以“.h”结尾(inb4,为了向后兼容而忽略了继承的 C 头文件)。

    【讨论】:

      【解决方案3】:

      这是合法的,因为push_back 通过 const 引用获取它的参数,然后创建对象的副本。构造函数的调用创建了一个临时对象,它是一个右值。一个 const 引用可以绑定一个右值。该方法不能修改它传递的对象,但它可以创建一个副本。

      【讨论】:

      • 不,程序员从不调用构造函数。我知道你在说什么,但我认为你的话具有误导性。
      【解决方案4】:

      虽然看起来像函数调用,但表达式Item(img,i)实际上是一个临时对象的创建。不同之处在于,在运行时,将为堆栈上的对象分配内存,然后调用构造函数,而如果这是常规函数调用,则不会分配内存。

      【讨论】:

      • 加上构建对象所涉及的所有其他内容。
      猜你喜欢
      • 2021-11-23
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2011-12-07
      相关资源
      最近更新 更多