obj x = obj(); ?

Gast #6163211
Lesenswert?

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 #6163290
Lesenswert?

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'".
Moderator #6163719
Lesenswert?

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 :)
#6164430
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren