2012-01-08 26 views
6

Uczę się teraz lekarzy i mam kilka pytań. Na tych liniach:Tworzenie obiektów C++ i konstruktor

Foo obj(args); 

Foo obj2; 
obj = Foo(args); 

Foo obj3 = Foo(args); 

pierwszej części: tylko 1 konstruktora nazywa (Foo) i obj jest inicjowany. Tak, tworzenie 1 obiektu.

Druga część: tworzenie tymczasowego obiektu obj2, wywołanie dla niego domyślnego ctor. W następnych wierszach tworzymy kolejną kopię Foo i przekazujemy jej kopię do operator=(). Czy to prawda? Tak więc, 3 lokalne tymczasowe obiekty, 2 wywołania konstruktorów.

Trzecia część: utwórz 1 obiekt Foo i przekaż jego kopię do operator=(). Tak więc, 2 obiekty temperatury i 1 wywołanie ctor.

Czy rozumiem to poprawnie? A jeśli to prawda, czy kompilator (na przykład ostatni gcc) zoptymalizuje je w typowych przypadkach?

+0

'operator =()' zwykle otrzymuje swój argument przez odwołanie, więc nie ma kopii podczas wywoływania go. – rodrigo

+0

Obiekt obj3 jest faktycznie tworzony przy użyciu operatora kopiowania, który nie przypisuje operatora. –

Odpowiedz

6

będę komentować pierwszego trzeci:

Foo obj3=Foo(args); 

Nie używa operator= który nazywa kopiowaniem zadanie. Zamiast tego wywołuje konstruktora kopii (teoretycznie). Nie ma tu zadania. Teoretycznie istnieją dwa obiekty, jeden jest tymczasowy, a inny to obj3. Kompilator może zoptymalizować kod, całkowicie eliminując tymczasowe tworzenie obiektu.

Teraz drugi:

Foo obj2;   //one object creation 
obj = Foo(args); //a temporary object creation on the RHS 

Oto pierwsza linia tworzy obiekt, wywołanie konstruktora domyślnego. Następnie wywołuje operator= przekazując obiekt tymczasowy utworzony z wyrażenia Foo(args). Tak więc istnieją tylko dwa obiekty, które tylko operator= przejmuje argument przez odniesienie const (co powinno zrobić).

Co do pierwszego, masz rację.

+0

OK, dzięki. Ale tak czy inaczej, w pierwszym przypadku powstaje tylko 1 obiekt typu 'Foo', w trzecim: 2 obiekty? – Ockonal

+0

Nie, zgodnie ze specyfikacją, część 1 i część 3 to dwa sposoby określania tej samej rzeczy. Nie ma różnicy w implementacji. –

+2

@MrLister: Nie. Istnieje subtelna różnica między '1' i' 3'. Wystarczy napisać kod testowy i utworzyć konstruktor-kopia "prywatny". Pierwszy się skompiluje, trzeci nie! – Nawaz

3
  1. Tak, Foo obj(args) tworzy jeden obiekt Foo i wywołuje ctor jeden raz.

  2. nie jest uważany za obiekt tymczasowy. Ale tak jak 1 Foo obj2 tworzy jeden obiekt i wywołuje ctor Foo. Zakładając, że masz na myśli obj2 = Foo(args) dla następnej linii, ta linia tworzy jeden tymczasowy obiekt Foo, a następnie wywołuje obj2.operator=(). Tak więc dla tego drugiego przykładu jest tylko jeden obiekt tymczasowy, pojedynczy nie-tymczasowy, Foo crybowie są wywoływani dwa razy (raz dla nie-tymczasowego, raz dla tymczasowego) i operator =() jest wywoływany raz.

  3. Nie, ta linia nie wywołuje operator=(). Po zainicjowaniu składni obj3 przy użyciu składni = jest prawie dokładnie tak, jakbyś użył nawiasów zamiast: Foo obj3(Foo(args)); Tak więc ta linia tworzy obiekt tymczasowy, a następnie wywołuje Ctor kopii, aby zainicjować obj3 używając tego tymczasowego obiektu.

1

Twoja terminologia jest nieco myląca.

Obiekty obj, obj2obj3 nie są nazywane "obiektami tymczasowymi". Tylko instancja utworzona w linii 3 przed przypisaniem do obiektu jest obiektem tymczasowym.

Ponadto, nie tworzysz "kopii Foo", tworzysz "instancję Foo" lub "obiekt typu Foo".

Powiązane problemy