我一直在寻找一个很好的解释,为什么/为什么不将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;
}
我认为构造函数既没有返回类型也没有语句......
答案 0 :(得分:8)
不是传递给push_back
的构造函数或其返回值。 C ++实际上使用构造函数来创建一个无名的临时对象,该对象仅在函数调用期间存在;通常,在堆栈上。然后将其传递给push_back
,push_back
将其内容复制到您的矢量中。
答案 1 :(得分:6)
这是合法的。
你永远不会自己打电话给构造函数;你实际上只是声明一个Item
类型的未命名或“临时”对象。查看使对象未命名时语法如何演变:
Item a(img,i); // normal
Item(img,i); // temporary
即使你看起来像是在调用构造函数,但事实并非如此。
无论如何,你可以在函数参数等中使用临时作为“rvalue”(因为它是一个),这就是你在这里做的。
顺便说一句,请勿使用旧的iostream.h
和vector.h
标头。它们早于1998年。在ISO标准C ++中,您应分别使用iostream
和vector
。 C ++中的标准头文件不以“.h”结尾(inb4,忽略为向后兼容而继承的C头)。
答案 2 :(得分:4)
这是合法的,因为push_back
通过const引用获取它的参数,然后创建该对象的副本。构造函数的调用创建一个临时对象,它是一个右值。 const引用可以绑定rvalue。该方法无法修改传递的对象,但可以创建副本。
答案 3 :(得分:3)
虽然它看起来像是一个函数调用,但表达式 Item(img,i)实际上是一个临时对象的创建。区别在于,在运行时,将为堆栈中的对象分配内存,然后将调用构造函数,而如果这是常规函数调用,则不会分配内存。