2009-10-03 8 views
6

Powiel możliwe:
Is there a difference in C++ between copy initialization and assignment initialization?Jaka jest różnica między int x = 1 i int x (1) w C++?

Jestem nowy na C++, ja rzadko zobaczyć ludzi za pomocą tej składni zadeklarować i zainicjować zmienną:

int x(1); 

próbowałem, kompilator nie narzekali, a wynik jest taki sam jak int x = 1, czy to właściwie to samo?

Wielkie dzięki wam wszystkim.

+2

Dupe: http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-assignment-initializ –

+0

Nie całkiem to samo. To pytanie wydaje się szczególnie dotyczyć inicjowania POD. – Boojum

Odpowiedz

13

Tak, dla typów wbudowanych int x = 1; i int x(1); są takie same.

Podczas konstruowania obiektów typu klasy, dwie różne składnie inicjalizacyjne są nieco różne.

Obj x(y); 

To bezpośredni inicjalizacji i instruuje kompilator wyszukiwania dla jednoznacznego konstruktora który zabierze y, lub coś, co y można niejawnie konwertowane do i używa tego konstruktora do inicjalizacji x.

Obj x = y; 

to kopii inicjalizacji i instruuje kompilator utworzenie tymczasowego Obj przez przekształcenie y i wykorzystuje Obj jest kopia konstruktora initalize x.

Kopiowanie initalization jest równoważna bezpośredniego inicjalizacji gdy typ y jest taki sam jak typ x.

Dla inicjuje kopiowanie, ponieważ tymczasowy użytek jest wynikiem niejawnej konwersji, konstruktorzy oznaczeni explicit nie są brani pod uwagę. Konstruktor kopiowania dla skonstruowanego typu musi być dostępny, ale sama kopia może zostać usunięta przez kompilator jako optmizacja.

+0

Warto podkreślić, że Obj x; x = y; produkuje kolejną odmianę.W tym przypadku wartość x zostanie skonstruowana domyślnie. Następnie, przy następnej instrukcji, zostanie wywołany operator przypisania. –

+3

Inną rzeczą wartą odnotowania jest to, że umożliwienie inicjalizacji zwykłych starych typów danych, takich jak int (z użyciem składni analogicznej do inwokacji konstruktora klasy), umożliwia przezroczystą pracę szablonów zarówno z typami POD, jak i klasami. – Boojum

+1

@ Booum: Dodanie tej funkcji do języka C++ miało na celu zapewnienie jednego sposobu inicjowania obiektów dowolnego typu w listach inicjujących. Jest to dla mnie ważniejsze (i powszechniejsze) niż inicjalizacja wewnątrz szablonów, którą można rozwiązać za pomocą składni "Type object = other_object". –

0

Nie jestem ekspertem C++, ale jeśli daje taki sam wynik, czy to ma znaczenie? Sądzę, że jeśli jesteś NAPRAWDĘ zainteresowany, możesz skompilować (ale nie zmontować) swój kod i sprawdzić, na czym polega różnica.

Edytuj: Jak już wspomniano w innych miejscach, są one naprawdę takie same dla typów wbudowanych.

+4

Oczywiście, że to ważne. Możesz zobaczyć te same wyniki, ale to może oznaczać, że nie wiesz, jakie skutki uboczne szukać lub nie wiesz o wszystkich przypadkach, które przyniosłyby inne rezultaty. To bardzo rozsądne pytania od początkującego/średnio zaawansowanego programisty. – mob

1

Dla typów POD obydwa stwierdzenia są identyczne.