Object obj();
nie jest instancji obiektu, jest to deklaracja z funkcji obj
który nie wymaga żadnych argumentów i zwraca instancję Object
.
Object obj;
jest default initialization
, czyli instancji z niejawny konstruktor (czyli domyślnej niejawny konstruktora lub zdefiniowanej przez użytkownika non explicit
konstruktora bez parametrów), a ta deklaracja wzywa ukryte konstruktorów non-POD Object
członków, a dla POD-types nie inicjuje ich (nie zostaną wyzerowane). To jest odpowiednie dla członków członków Object
i tak dalej rekursywnie.
Object obj{};
jest inicjalizacji lista lub kruszywo inicjalizacji (jeśli Object
jest agregatem). Te, które nazwano inaczej, dla pustych nawiasów, zachowanie jest takie samo: wszyscy członkowie typów POD są inicjowani od zera, a nie-POD są inicjowane domyślnie.
Object obj = Object();
teoretycznie jest dwuetapową instrukcją: 1) utworzyć tymczasową instancję Object
; 2) następnie skonstruuj obiekt przez konstruktora copy/move/operator copy/move. Ale w praktyce będzie on domyślnie skonstruowany z myślą o kopiowaniu/elizacji ruchu (domyślnie jest włączony we wszystkich nowoczesnych kompilatorach, nawet przy wyłączonych optymalizacjach, należy jawnie wyłączyć elizację). Lepiej nie używaj tego wariantu.
Wstępnie Wnioski
Wybierz
Object obj;
lub
Object obj{};
Wybierz najpierw, jeśli chcesz szybki inicjalizacji ze nie zeroifying jego POD członków. Wybierz drugie, jeśli chcesz mieć pewność, że po powieleniu Object
wszyscy jego członkowie POD będą zerowi.
Praktycznie przed pierwszym czytającym od jego członków, oba warianty mają taką samą prędkość w czasie wykonywania na wszystkich nowoczesnych systemach operacyjnych.
Więc ...
Wnioski
Wykorzystanie wartości inicjalizacji:
Object obj{};
chyba trzeba wydajności w czasie rzeczywistym na egzotycznych systemów.
OK, dlaczego pojawia się problem, gdy używam 'Object obj()', ale nie otrzymuję kiedy używam 'Object obj = Object()'? –
@ghostman dobrze powinieneś używać 'Object obj;', bez nawiasów – dabadaba
@juanchopanza teraz, gdy zauważyłem nawiasy, masz rację, są różne. Zakładam, że OP powiedział: "Object obj", a nie "Object obj()". – dabadaba