obj x = obj(); ?

Gast #6163211
Hallo,

ich würde gerne wissen, was hier passiert:

class meineKlasse
{
public:
    meineKlasse()
    {
    }
    meineKlasse(int x)
    {
    }



};


meineKlasse mK1;    //Objekt wird mit Standardkonstruktor erzeugt
meineKlasse mK2(1); //Objekt wird mit dem anderen Konstruktor erzeugt
meineKlasse mK3();  //??????

Es wird problemlos kompiliert, aber was für ein Ding ist nun mK3?
Gast
S. R. schrieb:
> Das gleiche wir mK1, du hast den Standardkonstruktur nur explizit
> angegeben.

so dachte ich auch, aber ich kann auf mK3 "nicht zugreifen"!
Gäbe es in der Klasse eine öffentliche Methode "void tueEtwas()", dann
wird mK1.tueEtwas() kompiliert und macht auch das erwartete, aber 
mK3.tueEtwas() wirft die Fehlermeldung "reques for member 'tueEtwas' in 
mK3, wich is of non-class type 'meineKlasse'".
Gast
> Kann das sein, dass der Compiler das als Funktionsdeklaration mit dem
> Rückgabewert meineKlasse ansieht? Wäre auch möglich.

Hört sich vernünftig an. Vielen Dank.
Moderator
S. R. schrieb:
> Kann das sein, dass der Compiler das als Funktionsdeklaration mit dem
> Rückgabewert meineKlasse ansieht? Wäre auch möglich.

So ist es.

Du kannst in den meisten Fällen die Konstruktorargumente auch in
geschweifte Klammern setzen, dann entsteht dieses Problem nicht:
1
meineKlasse mK2{1}; //Objekt wird mit dem anderen Konstruktor erzeugt
2
meineKlasse mK3{};

Edit: Zu spät abgeschickt :)
Yalu X. schrieb:
> S. R. schrieb:
>> Kann das sein, dass der Compiler das als Funktionsdeklaration mit dem
>> Rückgabewert meineKlasse ansieht? Wäre auch möglich.
>
> So ist es.

Nennt sich "most vexing parse" und ist ein Uralt-Fallstrick.

Das ist der Grund, warum ich immer zur uniform-initialization-syntax 
rate, auch wenn manche Leute hier das unschön finden. Hätte das o.g. 
Problem aber erfolgreich verhindert:
1
meineKlasse mk3{};
2
int x{};

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.