Forum: PC-Programmierung C++ Frage zu Konstruktor


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Böllermeister (Gast)


Lesenswert?

Hallo guten Tag,
diese Schreibweise kenne ich noch nicht von einem Konstruktor:
Dort habe ich es her:
https://gnome.pages.gitlab.gnome.org/gtkmm-documentation/sec-helloworld.html

Aber es funktioniert...
Worum handelt es sich denn hierbei?
1
HelloWorld::HelloWorld()
2
    : m_button("Hello World") // creates a new button with label "Hello World"
3
{... }
Danke :)

von Sebastian V. (sebi_s)


Lesenswert?

Ich nehme an du meinst den Teil hinter dem Doppelpunkt? Das ist die 
Member Initialization List. Da können Membervariablen und auch 
Basisklassen initialisiert werden.

von Böllermeister (Gast)


Lesenswert?

Sebastian V. schrieb:
> Ich nehme an du meinst den Teil hinter dem Doppelpunkt? Das ist
> die
> Member Initialization List. Da können Membervariablen und auch
> Basisklassen initialisiert werden.

Ok danke!
Kannte ich gar nicht.

von Da Baby (Gast)


Lesenswert?

Böllermeister schrieb:
> Sebastian V. schrieb:
>> Ich nehme an du meinst den Teil hinter dem Doppelpunkt? Das ist
>> die
>> Member Initialization List. Da können Membervariablen und auch
>> Basisklassen initialisiert werden.
>
> Ok danke!
> Kannte ich gar nicht.

ja ist wieder sowas was die welt nicht braucht. wirst du noch öfter 
sehen bei c++

von Vincent H. (vinci)


Lesenswert?

Da Baby schrieb:
> Böllermeister schrieb:
>> Sebastian V. schrieb:
>>> Ich nehme an du meinst den Teil hinter dem Doppelpunkt? Das ist
>>> die
>>> Member Initialization List. Da können Membervariablen und auch
>>> Basisklassen initialisiert werden.
>>
>> Ok danke!
>> Kannte ich gar nicht.
>
> ja ist wieder sowas was die welt nicht braucht. wirst du noch öfter
> sehen bei c++

Oje, da compiliert einer seine Programme wohl nur mit -O0. :)

von Wilhelm M. (wimalopaan)


Lesenswert?

Wenn Du noch nie einen Elementinitialisierer benutzt hast, dann hast Du

* ggf. Zuweisungen im ctor-Rumpf verwendet (meistens falsch),
* ggf. Elemente primitiver DT uninitialisiert gelassen (falsch),
* ggf. bisher nur in-class Initialisierer verwendet (geht nur, falls 
unabhängig von ctor-Parametern)
* ggf. noch nicht viel in C++ programmiert,
* ...

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Wilhelm M. schrieb:
> Wenn Du noch nie einen Elementinitialisierer benutzt hast, dann
> hast Du
>
> * ggf. Zuweisungen im ctor-Rumpf verwendet (meistens falsch),
> * ggf. Elemente primitiver DT uninitialisiert gelassen (falsch),
> * ggf. bisher nur in-class Initialisierer verwendet (geht nur, falls
> unabhängig von ctor-Parametern
> * ggf. noch nicht viel in C++ programmiert.

* noch nie const verwendet
* noch nie Basisklassenkonstruktoren mit Parametern aufgerufen
* ...

Da Baby schrieb:
> ja ist wieder sowas was die welt nicht braucht.

Die Welt braucht kein C++. Aber C++ braucht diese initialization list. 
Ohne gehts einfach nicht.

Oliver

von loeti2 (Gast)


Lesenswert?

Die Welt braucht unified initialization oder wie das heißt :)
1
HelloWorld::HelloWorld()
2
    : m_button{"Hello World"} // creates a new button with label "Hello World"
3
4
{
5
  std::string s{m_button};
6
  ...
7
  for (size_t i{0}; i != s.size(); ++i) {
8
    ...
9
  }
10
}

von Wilhelm M. (wimalopaan)


Lesenswert?

loeti2 schrieb:
> Die Welt braucht unified initialization oder wie das heißt :)

Heißt: uniform initialization syntax

>
>
1
> HelloWorld::HelloWorld()
2
>     : m_button{"Hello World"} // creates a new button with label "Hello 
3
> World"
4
> 
5
> {
6
>   std::string s{m_button};
7
>   ...
8
>   for (size_t i{0}; i != s.size(); ++i) {
9
>     ...
10
>   }
11
> }
12
>

Wusste gar nicht, dass std::string so einen ctor hat ;-) Oder 
Gtk::Button einen entsprechenden Typumwandlungs-Op ...

von loeti2 (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Wusste gar nicht, dass std::string so einen ctor hat ;-) Oder
> Gtk::Button einen entsprechenden Typumwandlungs-Op ...

Man lernt nie aus. Nee war mein Fehler.


Richtig cool wäre es wenn die uniform initialization syntax auch für 
default-Funktionsargumente gehen würde.
1
void foo(int i{0});
2
3
void foo(int i) {
4
  ...
5
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.