2013-06-02 19 views
5

Właśnie przeglądałem losowe strony na Cprogramming.com i zauważyłem stronę z samouczkiem/przykładem na stronie Constructors and Destructors. Zostały one wykorzystane następujące metody definiowania konstruktora:Co to jest korzyść z tej definicji konstruktora?

class String 
{ 
    private: 
     char *str; 
     int size; 
    public: 
     String() : str(NULL), size(0) { } // <- This statement 
     String(int size) : str(NULL), size(size) { // <- And this one 
      str = new char[size]; 
     } 
} 

Używam dobrej starej definicji konstruktorów z magicznym this palików:

String() { 
    this->str = NULL; 
    this->size = 0; 
} 
String(int size) { 
    this->size = size; 
    this->str = new char[size]; 
} 

Czy istnieją jakieś dodatkowe korzyści w pierwszej deklaracji obok oczywistego mniejszego kodu (mniejsza liczba linii)?

PS: Minęło sporo lat odkąd ostatnio napisałem coś w C++.

+1

http://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member-initialization-list –

Odpowiedz

11

constructor initialization lists, a dla podstawowych typów nie ma żadnej różnicy w stosunku do postaci jesteś przyzwyczajony do tego, który jest oparty na przypisania zamiast inicjowania.

Jednakże dla typów zdefiniowanych przez użytkownika nie może być różnicy pod względem wydajności (i semantyki być może) pomiędzy:

  1. domyślnych budowy obiektu i następnie przypisanie wartości do niego i
  2. bezpośrednio inicjalizując ją z tą wartością.

Ponadto, nie mają wyboru dla tych typów, które nie są default-constructible inny niż na podstawie listy inicjalizacji member aby je zainicjować, a ty nie masz wyboru dla const i członkowie referencyjne albo, które muszą należy natychmiast zainicjować.

0

Konstruowanie obiektów w C++ odbywa się w trzech etapach:

  1. pamięci jest aquired
  2. zmienne są inicjowane
  3. Konstruktor jest wykonywany.

Definicja konstruktor String() : str(NULL), size(0) {} wyznacza odpowiednią wartość do zmiennej w etapie 2.

Definicja konstruktor String() { this->str = NULL; this->size = 0; } czy to w etapie 3. Etap 2 jest jednak wykonywany jednak. Tak więc ten rodzaj przypisywania właściwej wartości zmiennym składowym jest mniej wydajny.

1

Byłem podobny do ciebie, z tylną starą wiedzą o kolażu, takie użycie wydaje się dziwne. Ale potem zrozum, że za pomocą tej techniki implementacje klasy niestandardowej zapewniają lepszą wydajność w środowisku wykonawczym. I here jest długim wyjaśnieniem list inicjacyjnych od ojca C++.