Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: FAQ - C++ (auch C++0x, C++11) ::  Initialisierungsliste vs. Konstruktor Body     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Mannid
Unregistrierter




Beitrag Mannid Unregistrierter 09:55:39 27.01.2010   Titel:   Initialisierungsliste vs. Konstruktor Body            Zitieren

Hallo,

ich wollte mal nachfragen, was der Vorteil ist eine Initialisierungsliste für die Initialisierungen der Klasse anstatt, anstatt dies ganz normal im Konstruktor "Body" zu machen?
Kann man auch Variablen die mittels anderer Methoden initialisiert werden müssen in der Initialisierungsliste initialisieren?
Macht es überhaupt Sinn in einer Klasse deren Konstruktur Body man man für bestimmte Zwecke braucht überhaupt Variablen mit der Initialisierungsliste zu initialisieren? Ich meine, dann wird ja sowieso der Konstruktor aufgerufen?

Danke euch!

Viele Grüße
Manfred
Werbeunterbrechung
asc
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.01.2007
Beiträge: 5713
Beitrag asc Mitglied 10:04:22 27.01.2010   Titel:   Re: Initialisierungsliste vs. Konstruktor Body            Zitieren

Mannid schrieb:
ich wollte mal nachfragen, was der Vorteil ist eine Initialisierungsliste für die Initialisierungen der Klasse anstatt, anstatt dies ganz normal im Konstruktor "Body" zu machen?


1. Findet eine "Initialisierung" nur in der Initialisierungsliste statt (im Konstruktorrumpf sind Variablen bereits initialisiert, und das was man dort macht sind dann Zuweisungen).
2. Referenzen und Konstanten können ausschließlich initialisiert werden (sprich nur in der Initialisierungsliste gesetzt werden).

Mannid schrieb:
Kann man auch Variablen die mittels anderer Methoden initialisiert werden müssen in der Initialisierungsliste initialisieren?


Ja.

Mannid schrieb:
Macht es überhaupt Sinn in einer Klasse deren Konstruktur Body man man für bestimmte Zwecke braucht überhaupt Variablen mit der Initialisierungsliste zu initialisieren? Ich meine, dann wird ja sowieso der Konstruktor aufgerufen?


Grundsätzlich ist eine initialisierung mittels Initialisierungsliste immer vorzuziehen. Einzig zu beachten ist dabei, das die initialisierung in der Reihenfolge abläuft, in der die Membervariablen im Header deklariert sind, und nicht in der Reihenfolge wie man sie in der Initialisierungsliste schreibt (Wichtig für Initialisierungen die voneinander abhängig sind). Daher sind bei mir Initialisierungslisten in der gleichen Reihenfolge wie im Header gehalten.

_________________
in theory there's no difference between theory and practice. in practice there is. (yogi berra)

In der Theorie gibt es kein Unterschied zwischen Theorie und Praxis. In der Praxis sehr wohl.
asc
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.01.2007
Beiträge: 5713
Beitrag asc Mitglied 10:19:45 27.01.2010   Titel:              Zitieren

Kleines Beispiel:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A
{
    private:
        const int a; // \ Zuweisung von Konstanten und Referenzen ist nur in der
        int & b;     // / Initialisierungsliste, nicht im Konstruktorrumpf zulässig.
        int c;
        int d;
 
    public:
        A(int & refB)
        :   a(10),    // Unabhängig davon, welche Reihenfolge man in der
            b(refB),  // Initialisierungsliste verwendet, findet die
            c(foo()), // Initialisierung in Reihenfolge der Deklaration statt.
            d(c + 10) // Wichtig für abhängige Initialisierungen wie z.B. bei d
        {
            c = 20;   // Dies ist eine Zuweisung, KEINE Initialisierung
        }
 
        static int foo()
        {
            return 10;
        }
};


Das im Konstruktorrumpf eine Zuweisung erfolgt, statt einer Initialisierung hat noch andere Konsequenzen, gerade bei komplexen Objekten.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Nehmen wir mal folgendes an: Klasse B ist eine Klasse mit einem Komplexen
// Konstruktor / Zuweisungsoperator.
 
class B { /**/ };
 
// Ersten Ansatz, der wohl deinen bisherigen Verständnis entspricht:
class A1
{
    private:
        B b;
    public:
        A1()
        // <-- Hier erfolgt der Aufruf des Standardkonstruktors von b
        {
            b = B(123); // <-- Hier im schlechtesten Fall neben einen
                        //     weiteren Konstruktoraufruf noch eine Zuweisung
        }
};
 
// Zweiter Ansatz über Initialisierungsliste:
class A1
{
    private:
        B b;
    public:
        A1()
        :   b(123) // <-- Hier erfolgt der entsprechende Konstruktoraufruf
        {
        }
};


Falls man keine Initialisierungsliste macht, laufen also mehrere Aktionen ab, und zudem ist ein Standardkonstruktor erforderlich.


Weitere Anwendung der Initialisierungsliste:
Mittels der Initialisierungsliste lässt sich von der Basisklasse ein anderer als der Standardkonstruktor verwenden.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Base
{
    public:
        Base();
        Base(int i);
};
 
class Derivered : Base
{
    public:
        Derivered()
        // <-- Ohne explizite Angabe, Aufruf von Base()
        {
        }
 
        Derivered(int a, int b)
        :   Base(a) // Explizite Verwendung von Base(int)
        {
        }
};

_________________
in theory there's no difference between theory and practice. in practice there is. (yogi berra)

In der Theorie gibt es kein Unterschied zwischen Theorie und Praxis. In der Praxis sehr wohl.
c++.de :: FAQ - C++ (auch C++0x, C++11) ::  Initialisierungsliste vs. Konstruktor Body   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.