<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Was alles const machen&#x2F; konstante Getter Funktionen]]></title><description><![CDATA[<p>Hio!<br />
Vielleicht habt ihr es ja schon bemerkt, ich arbeite gerade viel mit const herum <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Dazu habe ich (hoffentlich die letzten) zwei Fragen:<br />
Hier mal Beispielcode:</p>
<pre><code class="language-cpp">class Vector {
    private:
        double xPosition;
        double yPosition;
        double zPosition;

    public:
        Vector(double pXKoord, double pYKoord, double pZKoord);
        Vector(const Vector &amp;pPosition); 
        virtual ~Vector();

        void SetXKoord(double NewXKoord);
        void SetYKoord(double NewYKoord);
        void SetZKoord(double NewZKoord);

        double GetXKoord() const;
        double GetYKoord() const;
        double GetZKoord() const;
        double GetLength() const;

        void AddVector(const Vector &amp;pVector);
        void SubVector(const Vector &amp;pVector);
        void AddNumber(double pNumber);
        void SubNumber(double pNumber);
};
</code></pre>
<p>1. Frage: Wenn man schon strikt mit &quot;const&quot; umgeht, soll man dies auch in im Konstruktor oder z.B. in den Setter durchziehen? Also anstatt &quot;void SetXKoord(double NewXKoord);&quot; schreiben: &quot;void SetXKoord(const double NewXKoord);&quot;</p>
<p>Andere Beispielklasse:</p>
<pre><code class="language-cpp">class List {
    private:
        Vector *vector;
        List *next;
        List *last;
        List *firstEntry;
        int length;

    public:
        List();
        void Add(Vector &amp;Vector); //Der Vektor soll veränderbar sein
        Vector GetVector();
        List* Next();
        List* Last();
        List* First();
        void Delete();
        int GetLength();
};
</code></pre>
<p>2. Frage: Wenn ich den Getter vom Vektor konstant mache (also Vector GetVector() const;) dann ginge soetwas nicht mehr oder?:<br />
list-&gt;GetVector()-&gt;SetXKoord(1000); oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/223903/was-alles-const-machen-konstante-getter-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 12:18:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/223903.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 02 Oct 2008 11:33:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 11:33:28 GMT]]></title><description><![CDATA[<p>Hio!<br />
Vielleicht habt ihr es ja schon bemerkt, ich arbeite gerade viel mit const herum <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Dazu habe ich (hoffentlich die letzten) zwei Fragen:<br />
Hier mal Beispielcode:</p>
<pre><code class="language-cpp">class Vector {
    private:
        double xPosition;
        double yPosition;
        double zPosition;

    public:
        Vector(double pXKoord, double pYKoord, double pZKoord);
        Vector(const Vector &amp;pPosition); 
        virtual ~Vector();

        void SetXKoord(double NewXKoord);
        void SetYKoord(double NewYKoord);
        void SetZKoord(double NewZKoord);

        double GetXKoord() const;
        double GetYKoord() const;
        double GetZKoord() const;
        double GetLength() const;

        void AddVector(const Vector &amp;pVector);
        void SubVector(const Vector &amp;pVector);
        void AddNumber(double pNumber);
        void SubNumber(double pNumber);
};
</code></pre>
<p>1. Frage: Wenn man schon strikt mit &quot;const&quot; umgeht, soll man dies auch in im Konstruktor oder z.B. in den Setter durchziehen? Also anstatt &quot;void SetXKoord(double NewXKoord);&quot; schreiben: &quot;void SetXKoord(const double NewXKoord);&quot;</p>
<p>Andere Beispielklasse:</p>
<pre><code class="language-cpp">class List {
    private:
        Vector *vector;
        List *next;
        List *last;
        List *firstEntry;
        int length;

    public:
        List();
        void Add(Vector &amp;Vector); //Der Vektor soll veränderbar sein
        Vector GetVector();
        List* Next();
        List* Last();
        List* First();
        void Delete();
        int GetLength();
};
</code></pre>
<p>2. Frage: Wenn ich den Getter vom Vektor konstant mache (also Vector GetVector() const;) dann ginge soetwas nicht mehr oder?:<br />
list-&gt;GetVector()-&gt;SetXKoord(1000); oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592060</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Thu, 02 Oct 2008 11:33:28 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 11:56:10 GMT]]></title><description><![CDATA[<p>Zu 1.:<br />
Zitat von Pumuckl aus <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-223734.html" rel="nofollow">diesem</a> Thread (2. Antwort):</p>
<blockquote>
<p>Objekte kleiner Typen (z.B. alle eingebauten Typen, also auch int) per Referenz zu übergeben ist zwar möglich, aber allgemein nicht üblich. Die Übergabe per const-Referenz spart zwar eine Kopie des jeweiligen Objekts, allerdings muss die Referenz (intern meist ein Zeiger) erstellt und bei jedem Zugriff dereferenziert werden. Das ist bei kleinen Datentypen teurer als eine Kopie.</p>
</blockquote>
<p>Zu 2.:<br />
Ich meine, das geht schon, bin mir aber nicht sicher, da das const hinter den Klammern meines Wissens nach nur bewirkt, dass innerhalb der geschweiften Klammern nix geändert werden kann, also z.B. nur ein Wert zurückgegeben werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592076</guid><dc:creator><![CDATA[Speedy_92]]></dc:creator><pubDate>Thu, 02 Oct 2008 11:56:10 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 11:53:41 GMT]]></title><description><![CDATA[<p>*2 mal das Selbe gepostet*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592078</guid><dc:creator><![CDATA[Speedy_92]]></dc:creator><pubDate>Thu, 02 Oct 2008 11:53:41 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 12:01:04 GMT]]></title><description><![CDATA[<p>Frage 1 bezog ich nicht direkt auf eine Referenz auf kleine Typen sondern allgemein. Wenn ich weiss, dass ich in einer Funktion den übergebenen Wert nicht ändern will/werde, dann kann ich die übergeben Parameter doch gleich auch konstant übergeben oder nicht?<br />
also sowas:</p>
<pre><code class="language-cpp">int main() {
int a = 5;
int b = 10;
int c = Add(a,b); 
// oder direkt:
int c = Add(5,10);
std :: cout &lt;&lt; c &lt;&lt; std :: endl;
}

int add(const int a, const int b) {
return a+b;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1592083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592083</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Thu, 02 Oct 2008 12:01:04 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 12:03:49 GMT]]></title><description><![CDATA[<p>Pille456 schrieb:</p>
<blockquote>
<p>Frage 1 bezog ich nicht direkt auf eine Referenz auf kleine Typen sondern allgemein. Wenn ich weiss, dass ich in einer Funktion den übergebenen Wert nicht ändern will/werde, dann kann ich die übergeben Parameter doch gleich auch konstant übergeben oder nicht?<br />
also sowas:</p>
<pre><code class="language-cpp">int main() {
int a = 5;
int b = 10;
int c = Add(a,b); 
// oder direkt:
int c = Add(5,10);
std :: cout &lt;&lt; c &lt;&lt; std :: endl;
}

int add(const int a, const int b) {
return a+b;
}
</code></pre>
</blockquote>
<p>Nein. Konstante Parameter mit Übergabe als Wert machen keinen Sinn.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592084</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 02 Oct 2008 12:03:49 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 12:36:48 GMT]]></title><description><![CDATA[<p>Pille456 schrieb:</p>
<blockquote>
<p>2. Frage: Wenn ich den Getter vom Vektor konstant mache (also Vector GetVector() const;) dann ginge soetwas nicht mehr oder?:<br />
list-&gt;GetVector()-&gt;SetXKoord(1000); oder?</p>
</blockquote>
<p>Doch das geht, da das const nur bedeutet, dass die Liste nicht verändert wird. Das Objekt Vektor liegt als Kopie vor und die Kopie könnte man ändern.<br />
Aber warum willst Du denn den X-Wert überschreiben, den Du gerade zusammen mit dem Vektor aus der Liste geholt hast? das macht doch keinen Sinn - oder? Schau Dir mal zu dem Thema <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-192221-and-highlight-is-design.html" rel="nofollow">Set-Methoden diesen Thread</a> an. Jester und ich sind da verschiedener Meinung - also mache Dir selber ein Bild.</p>
<p>Zum Thema der <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-154875-and-highlight-is-basicvector.html" rel="nofollow">mathematische Vektor als Klasse findest Du hier</a> einiges.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592110</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 02 Oct 2008 12:36:48 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 14:27:07 GMT]]></title><description><![CDATA[<p>Folgende Möglichkeiten gibts ja für die Parameterübergabe, ich fass mal zusammen wan und warum man welche davon verwendet:</p>
<p><strong>const Referenz:</strong> du willst an dem übergebenen Objekt nichts ändern. deshalb const. lohnt wie oben schon zitiert für eingebaute Typen nicht, die übergibt man eher per value.<br />
<strong>non-const value:</strong> du willst mit dem übergebenen Wert arbeiten (z.B. nicht-konstante Memberfunktionen), aber das ursprüngliche Objekt, das der Funktion als Argument übergeben wurde, nicht verändern. Du brauchst also eine nicht-konstante Kopie.<br />
<strong>non-const Referenz:</strong> du möchtest ein Objekt ändern, das außerhalb der Funktion existiert. hier können/müssen referenzen auch auf eingebaute Datentypen benutzt werden. Die Möglichkeit, das externe Objekt zu ändern kostet dann eben ein bisschen mehr als ne Kopie.<br />
<strong>const value:</strong> eigentlich würden nach der Liste hier nurnoch kleine Objekte (eingebaute Typen) landen, die du in der Funktion nicht verändern willst. Das ist aber nur eine Einschränkung an dich als Implementor der Funktion, nicht an den Aufrufer. Allgemein stellt eine Funktionsschnittstelle aber nur Garantien und Anforderungen an den Aufrufer dar, keine Implementationsdetails. const value macht man also allgemein nicht.</p>
<p><strong>Der Vollständigkeit halber der Spezialfall:</strong> Man stelle sich eine kleine Klasse vor, (z.B. eniziges Member ein char, das IST klein) die const-methoden hat, die du in der Funktion benutzen willst. Du möchtest es also const machen, aber eine Referenz ist teurer als eine Kopie. Du könntest eine non-const Kopie machen und bei Bedarf const_casts benuten. die Sind aber eklig und unschön. Zweiter Anlauf: du machst eine non-const Kopie und direkt nach Eintritt in die Funktion kopierst du das Ding in ein const-Objekt. Und hoffst dass der compiler das schnallt und die Kopie wegoptimiert. Sieht auch nicht so toll aus, und wer weiß schon so recht ob der Compiler das wirklich immer wegoptimieren kann... Also doch const value?<br />
Antwort: nein, bzw. nur unter ganz bestimmten Bedingungen.<br />
- den Code durch die extra-Kopie oder const_casts zu verhunzen ist unschön.<br />
- die Schnittstelle durch Übergabe per const-Value zu verhunzen ist erst recht usnchön.<br />
- vorzeitige optimierungen sind auch unschön. und sich beim tippen Gedanken zu machen über die kopie eines 1-byte-objekts vs eine 4-byte-referenz (viel mehr wirds kaum sein) IST vorzeitig.<br />
- Einfache Konventionen die jeder kennt und versteht sind dagegen sehr schön.<br />
Und Konvention ist, einfach alles was kein eingebauter Datentyp ist, per const-referenz zu übergeben. WENN die Referenz teurer ist als eine Kopie, und WENN der Compiler sich da so schon nicht eigenständig drum kümmert (bei ner 1-char-klasse wird vermutlich jede methode kurz und inline sein udn am ende die ganze klasse wegoptimiert und ein nackter char bleibt übrig...), und WENN dir dann auch noch ein Profiler sagt, dass genau diese Übergabe eine wirklich kritische Stelle ist wo dir viel Performance verloren geht...<br />
Dann und nur dann ists an der Zeit, sich um den Spezialfall Gedanken zu machen - und vermutlich rettet dann ein Neudesign eher den Tag als sich um const value oder dergleichen Gedanken zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592233</guid><dc:creator><![CDATA[pumuckl@logged_off]]></dc:creator><pubDate>Thu, 02 Oct 2008 14:27:07 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 15:18:54 GMT]]></title><description><![CDATA[<p>Den Spezialfall verstehe ich nicht so ganz. const-Memberfunktionen können wunderbar auch mit nicht-konstanten Objekten direkt aufgerufen werden, es sei denn, es ist ein nicht-konstanter Overload im Weg. Das wäre aber nur tragisch, falls es signifikante Unterschiede zwischen beiden gibt (man denke z.B. an std::string - dort ist das Kopieren aber selbst mit COW nicht ganz billig).<br />
Zudem ist, wie richtig gesagt wurde, top-level const-Qualifikation von Funktionsparametern irrelevant für den Aufrufer. Wichtig dabei ist aber, dass diese Qualifikation nicht einmal in den Funktionstyp miteingeht. Es ist mithin möglich und durchaus sinnvoll, diese Qualifikation nur bei der Implementation anzugeben - der Aufrufer bekommt davon nichts mit.<br />
Und selbst wenn man auf diese andere Deklaration bei der Funktionsdefinition verzichten will (die ggf. manche Tools durcheinanderbringen könnte), gibt es eine einfache Lösung: indem wir in der Funktion einfach eine const-Referenz auf den Parameter definieren und anschließend nur diese nutzen.</p>
<pre><code class="language-cpp">void f(Foo /* should be const */ x)
{
    const Foo&amp; const_x = x;
    // benutze const_x ...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1592279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592279</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 02 Oct 2008 15:18:54 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 16:06:33 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Doch das geht, da das const nur bedeutet, dass die Liste nicht verändert wird. Das Objekt Vektor liegt als Kopie vor und die Kopie könnte man ändern.<br />
Aber warum willst Du denn den X-Wert überschreiben, den Du gerade zusammen mit dem Vektor aus der Liste geholt hast? das macht doch keinen Sinn - oder? Schau Dir mal zu dem Thema <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-192221-and-highlight-is-design.html" rel="nofollow">Set-Methoden diesen Thread</a> an. Jester und ich sind da verschiedener Meinung - also mache Dir selber ein Bild.</p>
<p>Zum Thema der <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-154875-and-highlight-is-basicvector.html" rel="nofollow">mathematische Vektor als Klasse findest Du hier</a> einiges.</p>
<p>Gruß<br />
Werner</p>
</blockquote>
<p>Wieso liegt eine Kopie vor? Ich übergebe bzw. Kopiere höchstens den Zeiger auf den Vektor, von daher macht es auch Sinn den Vektor zu ändern.<br />
Ein Beispiel:<br />
Die Vektorklasse bildet die Oberklasse für ein grafisches Objekt, was sich auf dem Bildschirm bewegt. Das macht ja erstmal Sinn, da sich eigentlich jedes (bewegliche) Objekt auf dem Bildschirm mathematisch als Vektor darstellen lässt. Die Unterklasse implementiert dann weitere Funktionen wie z.B. das genau Aussehen des Objektes (z.B. ein Auto).<br />
Wenn das Auto nun an den Rand kommt, soll es an der anderen Seite wieder auftauchen und dafür muss es dem Programm doch möglich sein die Position des Vektors (und damit des Autos) zu ändern.<br />
Nun haben wir viele Autos auf dem Bildschirm und sammeln die in einer Liste und schon sind wir bei dem dargestellten Beispiel.</p>
<p>Wie ihr in dem anderen Thread besprochen habt, es ist hier wirklich eine design Frage.</p>
<p>Also halten wir fest:<br />
- Es macht kein Sinn Standardtypen (wie char, int, bool) als Parameter eine Funktion konstant zu machen<br />
- Call by Reference immer mit const, es sei denn ich will die Variable auf die gezeigt wird wirklich ändern</p>
<p>Bleibt für mich gerade nur noch die Frage wann ich eine Funktion konstant (nennt man das dann so?), also &quot;const&quot; am Ende der Funktion schreibe.<br />
Hat dieses const wirklich nur den Sinn zu sagen, dass die Übergeben Variable nicht geändert wird?</p>
<p>Also:</p>
<pre><code class="language-cpp">void machwas(Vector &amp;pVector) const {
pVector = NULL; //Geht nicht
pVector.SetXKoord(1000); //keine Ahnung; Wann darf man dies und wann nicht?
double test = pVector.GetXKoord(); //geht
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1592309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592309</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Thu, 02 Oct 2008 16:06:33 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 17:01:59 GMT]]></title><description><![CDATA[<blockquote>
<p>Bleibt für mich gerade nur noch die Frage wann ich eine Funktion konstant (nennt man das dann so?), also &quot;const&quot; am Ende der Funktion schreibe.<br />
Hat dieses const wirklich nur den Sinn zu sagen, dass die Übergeben Variable nicht geändert wird?</p>
</blockquote>
<p>Nein. Es bedeutet, dass Du die Elemente der Klasse zu der die Funktion gehört nicht ändern darfst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592349</guid><dc:creator><![CDATA[maber]]></dc:creator><pubDate>Thu, 02 Oct 2008 17:01:59 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 18:15:25 GMT]]></title><description><![CDATA[<p>pumuckl@logged_off schrieb:</p>
<blockquote>
<p><strong>const value:</strong> eigentlich würden nach der Liste hier nurnoch kleine Objekte (eingebaute Typen) landen, die du in der Funktion nicht verändern willst. Das ist aber nur eine Einschränkung an dich als Implementor der Funktion, nicht an den Aufrufer. Allgemein stellt eine Funktionsschnittstelle aber nur Garantien und Anforderungen an den Aufrufer dar, keine Implementationsdetails. const value macht man also allgemein nicht.</p>
</blockquote>
<p>Dazu habe ich eine Frage. Angenommen du hast eine relativ komplexe seter Funktion die auch was ausrechen muss.</p>
<pre><code class="language-cpp">void setBla(const int i) {
  for(int x = 0; x &lt; i; i++) {
    calc(x, i); // rechne irgendwas abhängig von i und x
  }
}
</code></pre>
<p>Ich setzte hier i immer auf const um sicher zu gehen das der Compiler besser optimieren kann. Würde man beim for noch ein<br />
[ccp]<br />
#pragma omp parallel for<br />
[/cpp]<br />
hinzufügen wüsste ich nicht mehr was passiert...</p>
<p>Kann es also nicht sein dass das const aus Optimierungsgrüden doch sinnvoll ist?<br />
Ich pers. versuch in sowas so penibel wie möglich zu sein und setzte jede variable auf const die es auch ist. Schaden tut es nicht und wenn man es sich angewöhnt hat geht es wie von selbst.</p>
<p>LG<br />
Neph</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592397</guid><dc:creator><![CDATA[Nephelauxetic]]></dc:creator><pubDate>Thu, 02 Oct 2008 18:15:25 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 19:09:07 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Zudem ist, wie richtig gesagt wurde, top-level const-Qualifikation von Funktionsparametern irrelevant für den Aufrufer. Wichtig dabei ist aber, dass diese Qualifikation nicht einmal in den Funktionstyp miteingeht. Es ist mithin möglich und durchaus sinnvoll, diese Qualifikation nur bei der Implementation anzugeben - der Aufrufer bekommt davon nichts mit.</p>
</blockquote>
<p>Hast du das gelesen und verstanden?</p>
<p>EDIT: Die Frage geht an den Threadersteller nicht an camper.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592438</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Thu, 02 Oct 2008 19:09:07 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 19:30:38 GMT]]></title><description><![CDATA[<p>Pille456 schrieb:</p>
<blockquote>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Doch das geht, da das const nur bedeutet, dass die Liste nicht verändert wird. Das Objekt Vektor liegt als Kopie vor ...</p>
</blockquote>
<p>Wieso liegt eine Kopie vor? Ich übergebe bzw. Kopiere höchstens den Zeiger auf den Vektor, von daher macht es auch Sinn den Vektor zu ändern.</p>
</blockquote>
<p>Nun - weil Du es so hingeschrieben hast:</p>
<p>Pille456 schrieb:</p>
<blockquote>
<p>Andere Beispielklasse:</p>
<pre><code class="language-cpp">class List { // ...
    public:
        Vector GetVector();
</code></pre>
</blockquote>
<p>.. bedeutet ein Objekt der Klasse Vector zurückzugeben. Sonst hättest Du</p>
<pre><code class="language-cpp">class List { // ...
    public:
        Vector* GetVector();
</code></pre>
<p>schreiben müssen. Dies gibt einen Pointer auf einen Vector zurück.</p>
<p>Pille456 schrieb:</p>
<blockquote>
<p>Ein Beispiel:<br />
Die Vektorklasse bildet die Oberklasse für ein grafisches Objekt, was sich auf dem Bildschirm bewegt. Das macht ja erstmal Sinn, da sich eigentlich jedes (bewegliche) Objekt auf dem Bildschirm mathematisch als Vektor darstellen lässt. Die Unterklasse implementiert dann weitere Funktionen wie z.B. das genau Aussehen des Objektes (z.B. ein Auto).</p>
</blockquote>
<p>.. vielleicht. Man könnte aber auch sagen, dass ein Auto eine Position hat - also eine Klasse Auto einen Member vom Typ Vector besitzt.</p>
<p>Pille456 schrieb:</p>
<blockquote>
<p>Wenn das Auto nun an den Rand kommt, soll es an der anderen Seite wieder auftauchen und dafür muss es dem Programm doch möglich sein die Position des Vektors (und damit des Autos) zu ändern.</p>
</blockquote>
<p>Die Position ja - aber nicht zwingend die Koordinaten einzeln. Man könnte sich ja vorstellen, dass die Y-Position mit geändert wird, so dass sich das Auto wie auf einer Spirale bewegt.<br />
Meines Erachtens ist es für den allgemeine Fall sauberer die neue Position einfach zuzuweisen - ala</p>
<pre><code class="language-cpp">Vector aktPosVonAuto;
    aktPosAuto = Vector( neuesX, aktPosVonAuto.GetYKoord() );
</code></pre>
<p>.. aber ich möchte nicht diese <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-192221-and-highlight-is-design+complex.html" rel="nofollow">Diskussion über Set-Methoden</a> wiederholen.</p>
<p>Pille456 schrieb:</p>
<blockquote>
<p>Also halten wir fest:<br />
- Es macht kein Sinn Standardtypen (wie char, int, bool) als Parameter eine Funktion konstant zu machen<br />
- Call by Reference immer mit const, es sei denn ich will die Variable auf die gezeigt wird wirklich ändern</p>
</blockquote>
<p>so ist es.</p>
<p>Pille456 schrieb:</p>
<blockquote>
<p>Bleibt für mich gerade nur noch die Frage wann ich eine Funktion konstant (nennt man das dann so?), also &quot;const&quot; am Ende der Funktion schreibe.</p>
</blockquote>
<p>immer genau dann, wenn die Methode das Objekt, bei dem die Methode aufgerufen wird, nicht verändert.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592457</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 02 Oct 2008 19:30:38 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 19:55:45 GMT]]></title><description><![CDATA[<p><a href="http://gotw.ca/gotw/006.htm" rel="nofollow">http://gotw.ca/gotw/006.htm</a><br />
<a href="http://www.parashift.com/c++-faq-lite/const-correctness.html" rel="nofollow">http://www.parashift.com/c++-faq-lite/const-correctness.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592474</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Thu, 02 Oct 2008 19:55:45 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Thu, 02 Oct 2008 20:50:13 GMT]]></title><description><![CDATA[<p>Nephelauxetic schrieb:</p>
<blockquote>
<p>Kann es also nicht sein dass das const aus Optimierungsgrüden doch sinnvoll ist?</p>
</blockquote>
<p>Herb Sutter schrieb:</p>
<blockquote>
<p>Premature optimization is evil.</p>
</blockquote>
<p>Lass den Compiler seine Arbeit machen, mach du deine <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Vor allem versuch nicht, den Compiler bei seinen Optimierungen zu unterstützen, das kann gut nach hinten losgehen. Der versteht sein Geschäft nämlich meist besser als du <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592506</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 02 Oct 2008 20:50:13 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Fri, 03 Oct 2008 10:48:13 GMT]]></title><description><![CDATA[<blockquote>
<p>Lass den Compiler seine Arbeit machen, mach du deine <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Vor allem versuch nicht, den Compiler bei seinen Optimierungen zu unterstützen, das kann gut nach hinten losgehen. Der versteht sein Geschäft nämlich meist besser als du <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Allgemein wuerd ich dir da zustimmen. In diesem konkreten Fall sehe ich aber keine Moeglichkeit wie das nach hinten losgehen koennte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592839</guid><dc:creator><![CDATA[Nephelauxetic]]></dc:creator><pubDate>Fri, 03 Oct 2008 10:48:13 GMT</pubDate></item><item><title><![CDATA[Reply to Was alles const machen&#x2F; konstante Getter Funktionen on Fri, 03 Oct 2008 13:28:56 GMT]]></title><description><![CDATA[<p>Don06 schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Zudem ist, wie richtig gesagt wurde, top-level const-Qualifikation von Funktionsparametern irrelevant für den Aufrufer. Wichtig dabei ist aber, dass diese Qualifikation nicht einmal in den Funktionstyp miteingeht. Es ist mithin möglich und durchaus sinnvoll, diese Qualifikation nur bei der Implementation anzugeben - der Aufrufer bekommt davon nichts mit.</p>
</blockquote>
<p>Hast du das gelesen und verstanden?</p>
<p>EDIT: Die Frage geht an den Threadersteller nicht an camper.</p>
</blockquote>
<p>Ich weiß, ich wiederhole mich. Aber hast du das verstanden, was camper da gesagt hat? Ich fasse es noch mal in meinen Worten zusammen.</p>
<ol>
<li></li>
</ol>
<pre><code class="language-cpp">void foo(int i);
void foo(const int i);
</code></pre>
<p>Das ist _keine_ Überladung! Es sind Deklarationen von ein und derselben Funktion. In einer Deklaration schließt man meist so eine Art &quot;Vertrag&quot; mit dem Aufrufer, was für Bedingungen die Parameter erfüllen müssen und welchen Einfluss die Funktion auf die Parameter nimmt. Die const-Qualifikation von value-Parametern gibt weder dem Aufrufer noch der Funktion irgendwelche Informationen über diesen &quot;Vertrag&quot;. Es handelt sich ja schließlich nur um eine lokale Variable in die kopiert wird. Teilweise kann so eine const-Qualifikation in der Deklaration zu Verwirrung beim Aufrufer führen. Er denkt vielleicht, das const bringt im irgendwelche Informationen über die Arbeitsweise der Funktion. Das ist aber ein Fehleinschätzung.</p>
<p>Ungeachtet dessen kann es durchaus Sinn machen, Parameter, die innerhalb der Funktion nicht geändert werden sollen, const zu machen. Dies sollte aber aus genannten Gründen dann nur in der Definition erfolgen.</p>
<p>z.B.</p>
<pre><code class="language-cpp">// foo.h
void foo(int i);
// foo.cpp
void foo(const int i)
{
    // i kann nicht geändert werden
}
</code></pre>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1592946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1592946</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Fri, 03 Oct 2008 13:28:56 GMT</pubDate></item></channel></rss>