Das Schlüsselwort const im ersten Beispiel ist bedeutungslos. Sie sagen, dass Sie den Zeiger nicht ändern wollen. Der Zeiger wurde jedoch als Wert übergeben und es spielt keine Rolle, ob Sie ihn ändern oder nicht. Es wirkt sich nicht auf den Anrufer aus. Ähnlich könnten Sie das auch tun:
%Vor%Sie können das sogar tun:
%Vor%Da int als Wert übergeben wird, spielt die Konstante keine Rolle.
Im zweiten Beispiel sagen Sie, dass Ihre Funktion einen Zeiger auf einen Typ annimmt, aber dann implementiert, indem sie einen Zeiger auf einen anderen Typ verwendet, daher schlägt sie fehl.
Im ersten haben Sie dem Compiler versprochen, aber nicht anderen Benutzern der Klasse, dass Sie die Variable nicht bearbeiten werden.
In Ihrem zweiten Beispiel haben Sie anderen Benutzern der Klasse versprochen, dass Sie ihre Variable nicht bearbeiten, aber dieses Versprechen nicht einhalten können.
Ich sollte auch beachten, dass es einen deutlichen Unterschied zwischen
gibt %Vor%und
%Vor%und
%Vor%In der ersten Form ändert sich der Zeiger nie, aber Sie können das Objekt bearbeiten, auf das gezeigt wird. In der zweiten Form können Sie den Zeiger bearbeiten (auf ein anderes Objekt zeigen), aber nie auf die Variable, auf die er zeigt. In der endgültigen Form bearbeiten Sie weder den Zeiger noch das Objekt, auf das er zeigt. Referenz
Um der Frage etwas mehr Klarheit zu geben, können Sie immer MEHR const als weniger versprechen. Eine Klasse gegeben:
%Vor%Sie können die folgende Implementierung kompilieren:
%Vor%oder:
%Vor%ohne Probleme. Sie haben Ihren Benutzern gesagt, dass Sie möglicherweise ihre Variablen bearbeiten können. In Ihrer Implementierung haben Sie dem Compiler mitgeteilt, dass diese bestimmte Implementierung diese Variablen nicht bearbeiten wird, obwohl dies den Benutzern mitgeteilt wurde. Sie haben ein Versprechen an den Benutzer nicht gebrochen und so kompiliert der Code.
Siehe diese Frage , diese Frage und diese Frage .
Grundsätzlich bedeutet const nur, dass die Funktion den Wert des Zeigers nicht ändert. Der Inhalt des Zeigers ist nicht const und entspricht nicht der Unterschrift des Headers.
Dies ist mit einem anderen Variablentyp als einem Zeiger einfacher zu verstehen. Zum Beispiel können Sie die folgende Funktionsdeklaration haben:
%Vor%Die Definition kann folgendermaßen aussehen:
%Vor%Ob die Variable 'i' auf der Definitionsseite const ist oder nicht, ist ein Implementierungsdetail. Es hat keine Auswirkungen für die Clients dieser Funktion.
Es interessiert wahrscheinlich nicht viel an void Foo::foo(bar* const pBar)
, denn wie Sie den Zeiger selbst behandeln (const oder nicht) spielt keine Rolle außerhalb der Routine. Die C-Regeln sagen, dass keine Änderung an pBar auf irgendeine Weise außerhalb von foo stattfindet.
Wenn es jedoch (const bar* pBar)
ist, macht das einen Unterschied, weil der Compiler Callern nicht erlaubt, Zeiger auf nicht-konstante Objekte zu übergeben.
Im ersten Fall beeinflusst const
nicht die Schnittstelle, sondern nur die Implementierung. Sie sagen dem Compiler: "Ich werde den Wert von bar*
in dieser Funktion nicht ändern". Sie können immer noch ändern, worauf der Zeiger zeigt. Im letzteren Fall sagen Sie dem Compiler (und allen Aufrufern), dass Sie die bar
-Struktur nicht ändern, auf die bar*
auf zeigt.