在函数调用中使用构造函数?

时间:2011-03-10 09:51:32

标签: c++ function constructor arguments

我一直在寻找一个很好的解释,为什么/为什么不将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;
}

我认为构造函数既没有返回类型也没有语句......

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

这是合法的。

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

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

即使你看起来像是在调用构造函数,但事实并非如此。

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


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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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