2013-06-19 2 views
3

Я использую вектор STL, который является вектором параметров.Передача конструктора функции

std::vector<Parameter> foo; 

Я пытался найти способ, чтобы добавить объекты параметров к вектору без этого:

Parameter a; 
foo.push_back(a); 

Я наткнулся на реализации, который сделал это:

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

я думал что когда я создал объект, конструктор называется не наоборот. Почему я могу передать конструктор функции?

ответ

6

foo.push_back(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

+1

Это на самом деле не только стенография. Семантика программы отличается в обоих вариантах. При передаче анонимного объекта объект уничтожается в конце выражения. Но при объявлении переменной время жизни увеличивается до конца области. –

+0

@phresnel: Да, с точки зрения компилятора (педантичного) можно взять адрес 'a', поскольку это значение L; Я имел в виду с точки зрения программиста, когда он/она пишет это так, обычно это делается, чтобы не дать ему имя. – legends2k

+0

Или убедиться, что нет отходов или ресурсов, открытых в течение более длительного времени, чем необходимо. Быть неподходящим может даже быть катастрофическим.Представьте, что вы передаете какое-либо соединение с базой данных для функции, и после этой функции вы переходите в какой-то режим ожидания, и соединение, возможно, будет открываться в течение нескольких часов, дней, недель. Когда-нибудь это может вызвать исключение, потому что база данных была отключена, или база данных не может быть отключена, поскольку какой-то неактивный демон (ваш) продолжает открывать неиспользуемое соединение. Действительно, программисты на С ++ обязательно должны обладать видимостью и 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; 
}