将构造函数传递给函数
Passing a Constructor to a Function
我使用的是一个STL向量,它是一个参数向量。
std::vector<Parameter> foo;
我试图找到一种方法来添加参数对象到矢量,而不这样做:
Parameter a;
foo.push_back(a);
我遇到了这样一个实现:
foo.push_back(Parameter()); //Using the Parameter constructor
我认为当我创建一个对象时,构造函数被调用,而不是相反。为什么我可以传递构造函数给一个函数?
foo.push_back(Parameter());
将临时构造的Parameter对象传递给push_back
而不是构造函数,即Parameter()
是在堆栈上创建Parameter
类型对象的调用,并将其传递给vector
的push_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这一行将创建Parameter
的临时实例并将其复制到Foo
中。假设这是c++ 11之前的代码。新的std::vector<T>::push_back
对右值有重载,在这种情况下将没有副本。
当您调用Parameter()
时,将创建一个临时对象并传递给foo.push_back()
函数。前面声明了名称为Parameter a;
的对象,并将其传递给foo.push_back(a)
。通过这样做,您可以在程序中使用名为a
的对象。
传递的不是构造函数,而是一个临时对象。当您因为括号而执行Paramater()
时,它将创建一个对象。它有点像函数调用,例如getInput()
。
我们在这里忽略的另一点是,要将函数作为参数传递,根本不需要使用括号。下面是一个传递函数作为参数的例子:
#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;
}
这个主题是旧的,但我想添加一些东西,如果你真的想传递一个构造函数作为参数(作为函数指针)而不创建一个临时对象,你可以这样做,如果你使用的是最近的c++标准
foo([](){ return MyClass(); });
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- makefile对我的名称空间对象/函数/构造函数的不确定引用
- 没有可调用的匹配函数(构造函数),候选函数不同于对给定类型的引用
- C++库制作,隐藏在标头中没有友元的析构函数/构造函数
- 从另一个成员函数/构造函数调用C++构造函数是否执行初始值设定项列表
- 在另一个函数/构造函数 [C++] 中初始化后使变量只读
- std::调用函数时找不到函数构造函数
- 显式调用基类析构函数/构造函数合法吗
- 函数构造函数和nullptr
- 用委托构造函数构造函数
- 虚函数构造函数和调用虚函数时会发生什么
- 一些Qt函数/构造函数参数的内存管理
- 使用for_each或std::transform时,c++函函数构造函数是如何被调用的?
- std函数构造函数初始化