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

Eva*_*van 9 c++ constructor arguments function

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

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

moo*_*dow 8

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

  • +1.但是,"表达的持续时间"可能会更好. (5认同)

Lig*_*ica 7

这是合法的.

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

Item a(img,i); // normal
Item(img,i);   // temporary
Run Code Online (Sandbox Code Playgroud)

尽管看起来好像你正在像构造函数一样调用构造函数,但事实并非如此.

无论如何,你可以在函数参数等中使用临时作为"右值"(因为它是一个),这就是你在这里所做的.


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