2013-06-19 69 views
3

我正在使用一个STL向量,它是参数的向量。将构造函数传递给函数

std::vector<Parameter> foo; 

我试图找到一种方法,参数对象添加到载体不这样做:

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

心想:

Parameter a; 
foo.push_back(a); 

我碰到的是这样做的实现来当我创建一个对象时,构造函数被称为不是反之亦然。为什么我可以将构造函数传递给函数?

回答

6

foo.push_back(Parameter());行经暂时构造Parameter对象push_back和未构造即Parameter()是呼叫建立堆栈上Parameter类型的对象并把它传递到的vectorpush_back函数,其中它被移动/复制。因此,传递的不是构造函数本身,而是一个构造对象。

只有在确定a未在任何地方使用时,这只是简写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

虽然它实际上不仅仅是简写。程序的语义在两种变体中都有所不同。当传递一个匿名对象时,该对象在表达式的末尾被销毁。但是在声明一个变量时,生命周期会扩展到范围的末尾。 –

+0

@ phresnel:是的,从编译器(迂腐)的角度来看,可以把'a'的地址作为L值;从程序员的角度来看,当他/她这样写时,通常是为了避免给它命名。 – legends2k

+0

或者确保没有浪费或资源保持长时间打开。精确度甚至可能是灾难性的。想象一下,你将一些数据库连接传递给一个函数,并且在函数调用之后,你进入一些等待模式,并且连接可能会持续几小时,几天,几周。有一天,它可能会抛出一个异常,因为数据库被关闭,或者数据库不能关闭,因为一些不活动的守护进程(你的)保持打开一个未使用的连接。实际上,C++程序员一定是范围和RAII意识,并且像本地一样明智。 –

2

这条线将创建Parameter一个临时的实例,并将其复制到Foo。假设这是pre-C++ 11代码。新的std::vector<T>::push_back有rvalues重载,在这种情况下将不会有副本。

0

您未传递构造函数,而是传递临时对象。当你因为虚构而做Paramater()时,它会创建一个对象。它的类似于函数调用例如getInput()

1

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

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