V
ipsec schrieb:
volkard schrieb:
warum ist der Rückgabetyp eines Kunstuktors nicht void
Im Prinzip ist es irrelevant, welchen Rückgabewert der Konstruktor hat, weil es keine Möglichkeit gibt, ihn direkt aufzurufen.
Schade. Wäre direkter, als der Umweg per placement new.
ipsec schrieb:
MyClass a = MyClass(...) ruft ihn nur indirekt auf, sonst müsste es MyClass::MyClass(...) heißen. Der Konstruktor ist aber auch nicht statisch, also ginge das auch nicht. Somit müsste man also danach a.MyClass(...) aufrufen können, das geht nicht.
Eine Aufrufabkürzung darf es ja geben. Warum ist er nicht statisch?
MyClass* p=malloc(sizeof(MyClass));
MyClass::constructor(p);
sieht doch hübsch aus. Man könnte zum Beispiel auf natürliche Weise die Adresse der Funktion ziehen.
Da der Konstruktor somit niemals in einem Ausdruck verwendet werden kann, braucht er keinen Rückgabewert.
void als Rückgabewert würde aber auch nicht schaden, sondern den Laden ein wenig vereinfachen. Third-Party-Tools hätten es leichter, den Konstruktor als Funktion zu erkennen. Und schau Dir folgenden seltsamen Code an:
void test(){
//tuwas
//if(was)
return throw 0;//Klappt, seit der so spät nachträglichen Sprachvereinfachung, daß man void returnen darf.
//tuwasanderes
}
class MyClass{
MyClass(){
//tuwas
//if(was)
return throw 0;//error: returning a value from a constructor
//tuwasanderes
}
};
Da stimmt doch konzeptionell was nicht. Und es ist kein hübscher Weg, durch immer mehr Ausnahmeregeln die Ausnahmen zu regeln und dabei noch mehr Ausnahmen zu provozieren.
Interessanter wird die Sache beim Destruktor. Der kann in Ausdrücken verwendet werden.
Ja, der ist auch (fast) eine ganz normale Methode. Nur wenige Sonderregeln, wie daß er Basisklassendestruktoren automatisch aufruft, den vptr ändert, implementiert werden muß selbst wenn pur virtuell seiend, und nicht überladen werden kann. Kann man wenigstens seine Adresse ziehen?