将构造函数传递给函数

Passing a Constructor to a Function

本文关键字:函数 构造函数      更新时间:2023-10-16

我使用的是一个STL向量,它是一个参数向量。

std::vector<Parameter> foo;

我试图找到一种方法来添加参数对象到矢量,而不这样做:

Parameter a;
foo.push_back(a);

我遇到了这样一个实现:

foo.push_back(Parameter()); //Using the Parameter constructor

我认为当我创建一个对象时,构造函数被调用,而不是相反。为什么我可以传递构造函数给一个函数?

foo.push_back(Parameter());将临时构造的Parameter对象传递给push_back而不是构造函数,即Parameter()是在堆栈上创建Parameter类型对象的调用,并将其传递给vectorpush_back函数,在那里它被移动/复制。因此传递的不是构造函数本身,而只是被构造的对象。

这只是Parameter a; foo.push_back(a);的一种速记方式,当你确定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

这一行将创建Parameter的临时实例并将其复制到Foo中。假设这是c++ 11之前的代码。新的std::vector<T>::push_back对右值有重载,在这种情况下将没有副本。

当您调用Parameter()时,将创建一个临时对象并传递给foo.push_back()函数。前面声明了名称为Parameter a;的对象,并将其传递给foo.push_back(a)。通过这样做,您可以在程序中使用名为a的对象。

传递的不是构造函数,而是一个临时对象。当您因为括号而执行Paramater()时,它将创建一个对象。它有点像函数调用,例如getInput()

我们在这里忽略的另一点是,要将函数作为参数传递,根本不需要使用括号。下面是一个传递函数作为参数的例子:

#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;
}

这个主题是旧的,但我想添加一些东西,如果你真的想传递一个构造函数作为参数(作为函数指针)而不创建一个临时对象,你可以这样做,如果你使用的是最近的c++标准

foo([](){ return MyClass(); });