我使用的是STL向量,它是参数的载体。
std::vector<Parameter> foo;
我试图找到一种方法将Parameter对象添加到向量而不执行此操作:
Parameter a;
foo.push_back(a);
我遇到了一个执行此操作的实现:
foo.push_back(Parameter()); //Using the Parameter constructor
我认为当我创建一个对象时,构造函数被调用而不是反之亦然。为什么我可以将构造函数传递给函数?
答案 0 :(得分:6)
foo.push_back(Parameter());
将临时构造的Parameter对象传递给push_back
而不是构造函数,即Parameter()
是在堆栈上创建类型为Parameter
的对象的调用并传递它被移动/复制到push_back
的{{1}}函数。因此传递的不是构造函数本身,而只是构造对象。
当确定vector
未在任何地方使用时,这只是写Parameter a; foo.push_back(a);
的简写方式;
如果您想了解有关临时工具的更多信息,可能会有用:
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=198
http://msdn.microsoft.com/en-us/library/a8kfxa78%28v=vs.80%29.aspx
答案 1 :(得分:3)
该行将创建Parameter
的临时实例,并将其复制到Foo
。假设这是前C ++ 11代码。新的std::vector<T>::push_back
有一个rvalues的重载,在这种情况下,没有副本。
答案 2 :(得分:1)
当您调用Parameter()
时,会创建一个临时对象并将其传递给foo.push_back()
函数。以前,您声明了名为Parameter a;
的对象,并将其传递给此foo.push_back(a)
。通过这样做,您可以在程序的行下使用名为a
的对象。
答案 3 :(得分:0)
您没有传递构造函数,而是传递临时对象。当你因为pharenthesis而Paramater()
时,它会创建一个对象。它类似于函数调用,例如getInput()
。
答案 4 :(得分:0)
我们在这里缺少的另一点是,将函数作为参数传递,根本不使用括号。以下是将函数作为参数传递的示例:
#include <algorithm>
#include <vector>
#include <iostream>
// initialise sum and summing function
int sum = 0;
void sum_numbers( const int& number );
// Create a test for our sum function
int main(int argc, const char * argv[])
{
// create some numbers
std::vector<int> numbers;
numbers.push_back( 34 );
numbers.push_back( 73 );
numbers.push_back( 14 );
// passing "sum_numbers" function as a parameter
std::for_each( numbers.begin(), numbers.end(), sum_numbers );
// check that our sum function worked
std::cout << "The sum of numbers is: " << sum << std::endl;
return 0;
}
// add the current number to the sum
void sum_numbers( const int& number )
{
sum += number;
}