7

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

std::vector<Parameter> foo;

我试图找到一种在不这样做的情况下将 Parameter 对象添加到向量的方法:

Parameter a;
foo.push_back(a);

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

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

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

4

5 回答 5

7

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

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

于 2013-06-19T14:39:33.600 回答
4

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

于 2013-06-19T14:40:00.747 回答
1

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

于 2013-06-19T14:44:33.057 回答
0

您没有传递构造函数,而是传递了一个临时对象。当你Paramater()因为括号而这样做时,它会创建一个对象。例如,它有点像函数调用getInput()

于 2013-06-19T14:40:06.793 回答
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;
}
于 2013-06-19T21:53:38.923 回答