c++ 将构造函数传递给函数

s6fujrry  于 2023-05-30  发布在  其他
关注(0)|答案(6)|浏览(142)

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

std::vector<Parameter> foo;

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

Parameter a;
foo.push_back(a);

我遇到了一个这样做的实现:

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

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

whlutmcx

whlutmcx1#

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

ghhkc1vu

ghhkc1vu2#

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

50few1ms

50few1ms3#

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

zpjtge22

zpjtge224#

你不是在传递一个构造函数,而是在传递一个临时对象。当你因为相位而执行Paramater()时,它会创建一个对象。它有点像一个函数调用,例如getInput()

ecbunoof

ecbunoof5#

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

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

jhiyze9q6#

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

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

相关问题