Warum ist die Zuweisung bei Klassen ohne =-Operator möglich?



  • Ich habe folgendes Beispielprogramm:

    class Test
    {
    public:
    
    	Test ():
    		i (0)
    	{
    	}
    
    private:
    
    	int i;
    };
    
    int main ()
    {
    	Test test1, test2;
    
    	test1=test2;
    }
    

    Warum gibt die Zeile

    test1=test2;
    

    keinen Fehler? Normalerweise hat man ja den =-Operator, den das Programm an so einer Stelle aufruft. Aber wenn man den nicht hat, funktioniert so eine Zuweisung trotzdem. (Er kopert dann, meines Wissens nach, einfach sämtliche Attribute des einen Objekts auf das andere.) Warum ist das so? Wäre es nicht viel logischer, hier eine Fehlermeldung auszugeben, weil kein =-Operator definiert wurde? Und wie kann ich das unterbinden, wenn ich nicht will, daß man Objekte kopieren kann?



  • Weil der Compiler einen standard Kopierkonstruktor anlegt...



  • Es gibt einige Funktionen, die sind so fundamental, daß jede Klasse sie haben muß. Und deshalb erstellt der Compiler für deine Klassen einen Default-Ctor*, Copy-Ctor, operator= und Dtor, wenn du sie nicht selbst angegeben hast. Diese sind öffentlich und setzen die entsprechenden Methoden aller Basisklassen und Member ein.

    * der Default-Ctor wird nur angelegt,, wenn deine Klasse gar keinen handgeschriebenen Ctor hat.



  • Wenn du folgende Operatoren nicht implementierst werden diese vom compiler automatisch:

    - Standardkontruktor (nur wenn du keinen anderen hast)
    - Destruktor
    - Kopierkontruktor (macht nur flache kopien)
    - Zuweisungsoprator



  • Kann ich das auch irgendwie verhindern? Denn wie gesagt, manchmal will man nicht, daß Objekte kopiert werden können.



  • Deklariere einen Copy-Constructor und einen Zuweisungsoperator private, und lass die Implementierung weg.



  • Klar, das ist natürlich möglich. Danke für den Tip.



  • CStoll schrieb:

    Es gibt einige Funktionen, die sind so fundamental, daß jede Klasse sie haben muß.

    Der Grund liegt IMO eher darin, dass Zuweisung von structs in C funktioniert, also muss es in C++ auch gehen.



  • nicht nur möglich sondern der einzige weg... wenn du soe als private deklaierst, dann bekommst du auch schon beim kompilieren eine entsprechende fehlermeldung und kannst quasi nichts mehr falsch machen.

    (bei boost gibt es z.B. eine art interfaces, bei denen diese prtoteced sind. leitet man von diesen ab, dann sieht man schön an der klassendeklaration, dass sie nicht kopierbar ist)


Log in to reply