2011-03-10 5 views
7

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

// Begin simple illustrative example C++ program  
#include<vector.h> 

struct Item 
{ 
    Item(double data, const int lead) 
    : m_grid(data), m_lead(lead) {} 

    double m_grid; 
    int m_lead; 
}; 

int main() 
{ 
    double img = 0.0; 
    int steps = 5; 
    std::vector<Item> images; 
    for (int i = 0; i < steps; i++) 
    { 
    img += 2.0; 
    images.push_back(Item(img,i)); 
    } 
    return 0; 
} 

Я был под впечатлением, конструктор не имеет ни тип возвращаемого значения, ни о ...

+1

Это C++? Укажите свой язык. –

+0

К сожалению, да, C++ – Evan

ответ

4

Это законно.

Вы никогда не называете конструктора самостоятельно; вы на самом деле просто объявляете неназванный или «временный» объект типа Item. Посмотрите, как синтаксис развивается, когда вы делаете объект неназванным:

Item a(img,i); // normal 
Item(img,i); // temporary 

Даже если это выглядит, как если бы вы вызываете конструктор как функцию, вы не.

В любом случае, вы можете использовать временное значение как «rvalue» (потому что оно одно) в аргументах функции и тому подобное, что вы здесь делаете.


BTW, не используйте старые iostream.h и vector.h заголовки. Они предшествовали 1998 году. В стандарте ISO C++ вы должны использовать iostream и vector соответственно. Стандартные заголовки в C++ не заканчиваются на «.h» (inb4, игнорируя заголовки C, унаследованные для обратной совместимости).

4

Это законно, потому что push_back принимает это аргумент по константной ссылке, а затем создает копию объекта. Вызов конструктора создает временный объект, который является rvalue. Ссылка на константу может связывать значение r. Метод не может изменить передаваемый объект, но он может создать копию.

+0

Нет, программист никогда не вызывает конструктор. Я знаю, что вы говорите, но я думаю, что ваши слова вводят в заблуждение. –

3

Хотя это выглядит как вызов функции, выражение Пункт (img, i) на самом деле является созданием временного объекта. Разница в том, что во время выполнения память будет выделена для объекта в стеке, а затем будет вызываться конструктор, тогда как если бы это был обычный вызов функции, то никакой памяти не было бы выделено.

+0

Плюс все другие вещи, связанные с конструированием объекта. –

8

Это не конструктор или его возвращаемое значение, которое передано push_back. C++ фактически использует конструктор для создания неназванного временного объекта, который существует только на время вызова функции; как правило, в стеке. Затем он передается в push_back, а push_back копирует его содержимое в ваш вектор.

+5

+1. «продолжительность выражения» может быть лучше. –

Смежные вопросы