Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Const-Correctness: const Object* const method() const

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.06.2010, 10:59 Uhr
Svenska



Hallo an alle,
ich bin zwar schon seit einigen Jahren am coden, dennoch hatte ich vor kurzem eine grundsätzliche Diskussion über const-correctness.

Problem:

C++:
const Object* const method() const


const nach Reihenfolge:

1. Inhalt des Objektes kann nicht verändert werden
2. Der Pointer darf nicht verändert werden
3. Methode darf keine member verändern

-> Bei 2. fällt mir aber kein Beispiel ein, wie man überhaupt den Pointer verändern kann.

so etwas wie

C++:
method() = new Object();

funktioniert eben nicht.

Da eine solche Methodensignatur eben in fast jedem const-correctness-dokument erwähnt wird, muss das const doch einen realen nutzen haben.

Hat da jemand eine Idee?

Gruß Sven
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.06.2010, 11:17 Uhr
0xdeadbeef
Gott
(Operator)


Wenn du den Zeiger const deklarierst, versprichst du, ihn später nicht zu ändern. Das solltest du natürlich nur tun, wenn du ihn nicht ändern musst.

Allerdings wäre auch mit

C++:
Object const *method() const;


der Ausdruck

C++:
method() = new Object(); // KAWUMM!


nicht möglich, weil method keine Referenz zurückgibt (method() ist dementsprechend kein L-Wert).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 24.06.2010 um 11:20 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.06.2010, 14:07 Uhr
Svenska



Vielen Dank für die Antwort :-).

Bei meiner Frage hatte ich allerdings gemeint, ob es einen Unterschied zwischen den beiden Zeilen einen Unterschied gibt:

C++:
Object* const method();
Object* method();



Mir fällt nämlich keine Möglichkeit ein, den Pointer bei einem Rückgabewert zu verändern. Somit wäre die erste Zeile equivalent zur zweiten und das const würde nicht bringen. Weiter unten habe ich mal etwas beispielcode eingefügt. Wenn jemand doch eine Möglichkeit kennt, die das const rechtfertigt, bitte auch mit codebeispiel einfügen.


C++:
class Container
{
public:
  Container()
  {
     m_pcMyObject = new Object();
  }

  //Object* get()
  Object* const get()
  {
    return m_pcMyObject;
  }
private:
  Object* m_pcMyObject;
};

void main()
{
  Container m_cMyContainer;

  Object* myObject = m_cMyContainer.get();

  //const hatte keinen Einfluss, da das lokale object auch nicht const war!
  myObject = new Object();
}





Wie gesagt, es macht mich eben nur stutzig, dass das in so vielen const-correctness docs steht.

Gruß Sven

Dieser Post wurde am 24.06.2010 um 14:08 Uhr von Svenska editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.06.2010, 14:26 Uhr
0xdeadbeef
Gott
(Operator)


Ich nehme an, dass das Beispiel so geschrieben ist, um alle Verwendungen von const in einer Zeile zu erschlagen. Über die pädagogische Sinnhaftigkeit des Unterfangens schweige ich lieber.

Prinzipiell kann es aber schon Sinn machen, Rückgabewerte const zu deklarieren, um mögliche Fehlerquellen zu entfernen. Ich nehme mal das Beispiel aus Effective C++ (item 3):

C++:
class Rational { ... };

const Rational operator*(const Rational &lhs, const Rational &rhs);

// ...

Rational a, b, c;

if(a * b = c) { // Tipfeeler! Gemeint ist ==
  // ...
}


Ohne das const (und in der Annahme, dass Rational als bool interpretierbar ist), würde dieser Code kompilieren und Verwirrung stiften.

Scott Meyers rät deswegen dazu, const zu benutzen, wo immer es geht, und ich stimme ihm da zu. In deinem speziellen Fall macht es aber wohl keinen Unterschied.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.06.2010, 15:56 Uhr
Svenska




Zitat:
In deinem speziellen Fall macht es aber wohl keinen Unterschied.


Das habe ich mir ja auch schon gedacht, doch jetzt habe ich endlich mal eine andere Meinung dazu gehört :-).

Vielen Dank nochmal dafür.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: