将构造函数传递给函数

时间:2013-06-19 14:36:58

标签: c++ constructor temporary-objects

我使用的是STL向量,它是参数的载体。

std::vector<Parameter> foo;

我试图找到一种方法将Parameter对象添加到向量而不执行此操作:

Parameter a;
foo.push_back(a);

我遇到了一个执行此操作的实现:

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

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

5 个答案:

答案 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;
}