将构造函数传递给函数
Posted
技术标签:
【中文标题】将构造函数传递给函数【英文标题】:Passing a Constructor to a Function 【发布时间】:2013-06-19 14:36:57 【问题描述】:我正在使用一个 STL 向量,它是一个参数向量。
std::vector<Parameter> foo;
我试图找到一种在不这样做的情况下将 Parameter 对象添加到向量的方法:
Parameter a;
foo.push_back(a);
我遇到了这样的实现:
foo.push_back(Parameter()); //Using the Parameter constructor
我认为当我创建一个对象时,构造函数被调用,反之亦然。为什么我可以?
【问题讨论】:
【参考方案1】: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
【讨论】:
它实际上不仅仅是一个速记,虽然。程序的语义在两种变体中都不同。当传递一个匿名对象时,该对象在表达式的末尾被销毁。但是在声明变量时,生命周期会延长到作用域的末尾。 @phresnel:是的,从编译器(迂腐)的角度来看,a
的地址是 L 值;我的意思是从程序员的角度来看,当他/她这样写时,通常这样做是为了避免给它起名字。
或者确保没有浪费或资源保持开放时间超过必要的时间。不精确甚至可能是灾难性的。想象一下,您将一些数据库连接传递给一个函数,在该函数调用之后,您进入某种等待模式,并且连接可能会保持打开数小时、数天、数周。有一天,它可能会因为数据库被关闭而引发异常,或者由于某些不活动的守护程序(您的)保持打开未使用的连接而无法关闭数据库。确实,C++ 程序员绝对应该了解范围和 RAII,并尽可能在本地做事。
@JacobSharf:向量拥有其中包含的资源;你can't create a vector of references。延长生命周期主要适用于对象按值返回并且在调用方将其分配给引用的情况,因为该对象与引用一样长。我大多只在函数和本地范围内看到这些。
@JacobSharf 使用 C++11 的 std::reference_wrapper,可以创建引用向量,但它的构造函数只需要 T&
而不是 const T&
或 T&&
所以 foo.push_back(Parameter())
would not compile .【参考方案2】:
该行将创建Parameter
的临时实例并将其复制到Foo
。假设这是 C++11 之前的代码。新的std::vector<T>::push_back
对右值有重载,在这种情况下将没有副本。
【讨论】:
【参考方案3】:当您调用Parameter()
时,会创建一个临时对象并将其传递给foo.push_back()
函数。之前您声明了名称为Parameter a;
的对象并将其传递给foo.push_back(a)
。通过这样做,您可以在程序行中使用名为a
的对象。
【讨论】:
【参考方案4】:您没有传递构造函数,而是传递了一个临时对象。当您因为括号而执行 Paramater()
时,它会创建一个对象。它有点像函数调用,例如getInput()
。
【讨论】:
【参考方案5】:我们在这里缺少的另一点是,将函数作为参数传递,您根本不使用括号。下面是一个将函数作为参数传递的示例:
#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;
【讨论】:
以上是关于将构造函数传递给函数的主要内容,如果未能解决你的问题,请参考以下文章