Schlüsselwort const



  • Hallo,

    kann mir jemand erklären, wie bei C++ die const Schlüsselworte in der Parameterübergabe einer Funktion zu verstehen sind?

    Ich habe in einem Tutorial gelesen, dass wenn ich einen Pointer wie folgt deklariere:

    const double *const d;
    

    dann bedeutet das zweite const, dass ich den Pointer nicht ändern darf und das erste, dass ich das double nicht ändern darf, auf dass er zeigt.

    Mein Problem sieht so aus:

    Ich habe zwei Methoden einer Klasse, die je einen Pointer bekommen und nach aussen hin versprechen sollen, dass sie den Wert nicht verändern:

    class Klasse
    {
      double *d;
    
      static void methode1(const double *d)
      {
      }
      static void methode2(const Klasse *k)
      {
        methode1(k->d); // <-- Fehler: cannot convert parameter 1 from
                        //             'double *const' to 'const double *'
      }
    }
    

    Auch eine Deklaration der Form

    void methode1(const double *const d)
    

    ändert nichts an dem Fehler.
    Was muss ich ändern, damit es kompiliert ohne dass ich auf das const verzichten muss?



  • Muss denn der double in der Klasse k unbedingt "double * const" sein? Imho klingt "double * const" sehr stark nach einem "double&"...

    Lass dir mal durch den Kopf gehen obs eine Referenz nicht auch tun würde -> dann funktioniert auch der Methodenaufruf.

    MfG SideWinder



  • Hi!

    Also VC++7.1 hat deine Klasse da oben und diese einwandtfrei kompiliert:

    class Klasse
    {
      double *const d;
    
      static void methode1(const double *const d)
      {
      }
      static void methode2(const Klasse *k)
      {
        methode1(k->d);
      }
    };
    

    Kanm der Fehler vllt., weil du vor k->d ein & stehen hattest, dann gibt VC++7.1 nämlich dies aus:

    c:\*********\Main.cpp(12): error C2664: 'Klasse::methode1': Konvertierung des Parameters 1 von 'double *const *__w64 ' in 'const double *const ' nicht möglich

    Code-Hacker



  • Hi!

    SideWinder schrieb:

    Imho klingt "double * const" sehr stark nach einem "double&"...

    Stimmt. Somit wäre dann "const double *const" -> "const double&" oder habe ich da jetzt einen Denkfehler?

    Code-Hacker



  • Nicht ganz, ein Zeiger bleibt weiterhin ein Objekt mit einem Speicherbereich. Eine Referenz ist bloß ein anderer Name für den Speicher der double-Variable.

    Und der Zugriff geschieht natürlich anders (ich beziehe mich jetzt da auf die verwendete Syntax)

    MfG SideWinder



  • Danke für die Antworten, hat mir weitergeholfen.

    SideWinder schrieb:

    Muss denn der double in der Klasse k unbedingt "double * const" sein? Imho klingt "double * const" sehr stark nach einem "double&"...

    Es muss ein Pointer sein, weil sich dahinter eigentlich ein double-Array verbirgt, und soweit ich weiss kann man Arrays nicht als Referenz zurückgeben oder deklarieren.

    Ich hätte den geposteten Beispielcode vorher ausprobieren sollen, der kompiliert wirklich, wie Code-Hacker richtig bemerkte (sorry). Der Unterschied zu meinem Programm ist nun, dass d eigentlich ein zweidimensionales double-Array ist:

    class Klasse
    {
      double **d;
    
      static void methode1(const double **d)
      {
      }
      static void methode2(const Klasse &k)
      {
        methode1(k.d); // cannot convert parameter 1
                       // from 'double **const' to 'const double **'
      }
    };
    

    Das kompiliert dann nicht mehr.

    Und das brachte mich gerade auf die Idee, folgendes auszuprobieren:

    static void methode1(const double * const *d)
    

    Sieht irgendwie krank aus, aber das kompiliert fehlerfrei.
    Scheinbar muss man dem Compiler sagen dass man jede Dimension des Arrays nicht verändern wird in der Methode. Merkwürdige Syntax, aber funktioniert.

    Danke für Eure Hilfe.


Anmelden zum Antworten