2011-03-10 20 views
7

Szukałem na chwilę wyjaśnienia, dlaczego/dlaczego następujące użycie konstruktora struct jako argument funkcji jest legalne. Czy ktoś może to zapewnić?Korzystanie z konstruktora w wywołaniu funkcji?

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

byłem pod wrażeniem, konstruktor ma ani typ zwracany ani oświadczenie ...

+1

Czy to jest C++? Proszę podać swój język. –

+0

Niestety, tak, C++ – Evan

Odpowiedz

4

Jest legalny.

Nigdy nie wywołujesz konstruktora; w rzeczywistości deklarujesz tylko nienazwany lub "tymczasowy" obiekt typu Item. Zobacz jak składnia ewoluuje w momencie tworzenia obiektu bezimienny:

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

Chociaż wygląda na to, jeśli wywołanie konstruktora jak funkcja, nie jesteś.

W każdym razie możesz użyć tymczasowego jako "rwartości" (ponieważ jest to jeden) w argumentach funkcji i tym podobnych, co tutaj robisz.


BTW, nie używać starych iostream.h i vector.h nagłówków. Poprzednio 1998. W ISO Standard C++ powinieneś używać odpowiednio: iostream i vector. Standardowe nagłówki w C++ nie kończą się na ".h" (inb4, ignorując nagłówki C odziedziczone po kompatybilności wstecznej).

4

Jest to legalne, bo push_back trwa to argument const odniesienia, a następnie tworzy kopię obiektu. Wywołanie konstruktora tworzy obiekt tymczasowy, który jest rwartością. Odwołanie do const może powiązać wartość r. Metoda nie może modyfikować obiektu, który został przekazany, ale może utworzyć kopię.

+0

Nie, programista nigdy nie wywołuje konstruktora. Wiem, co mówisz, ale myślę, że twoje słowa są mylące. –

3

Chociaż wygląda na wywołanie funkcji, wyrażenie Element (img, i) jest w rzeczywistości tworzeniem tymczasowego obiektu. Różnica polega na tym, że w środowisku wykonawczym pamięć zostanie przydzielona dla obiektu na stosie, a następnie zostanie wywołany konstruktor, natomiast w przypadku zwykłego wywołania funkcji nie będzie przydzielana żadna pamięć.

+0

Plus wszystkie inne rzeczy związane z konstruowaniem obiektu. –

8

To nie jest konstruktor ani jego wartość zwracana, która została przekazana do push_back. C++ faktycznie używa konstruktora do utworzenia bezimiennego obiektu tymczasowego, który istnieje tylko przez czas trwania wywołania funkcji; zazwyczaj na stosie. Następnie jest przekazywana do push_back, a push_back kopiuje jej zawartość do Twojego wektora.

+5

+1. "Czas trwania wyrażenia" może być jednak lepszy. –

Powiązane problemy