Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Rückgabewert als 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
02.02.2008, 18:48 Uhr
nei



Hallo ich habe einige Fragen bezüglich const:
angenommen man hat folgende 2 getNumber-Funktionen, ich verstehe nicht wieso man Variablen als const zurück geben sollte, falls das Ziel sein sollte, dass man die Variable nicht ändern sollte funktioniert das ja nicht. Z.B. funktioniert ja folgendes:

C++:
int a = var.getNumber();// Dies funktioniert mit beiden getNumber Funktionen


Müsste a nicht auch const sein?

C++:
const int &getNumber() const {    
    return Number;
}

int getNumber() const {    
    return Number;
}


und wenn Number kein Klassen-Member, sondern eine normale Variable dann funktioniert auch folgendes, wieso?

C++:
int &getNumber() const {    
    return Number;
}


MFG


Bearbeitung von 0xdeadbeef:

cpp-Tags eingefügt, nächstes Mal selbst machen.


Dieser Post wurde am 02.02.2008 um 21:03 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.02.2008, 21:03 Uhr
0xdeadbeef
Gott
(Operator)


Ne, in a wird der Rückgabewert reinkopiert. Die Kopie ist dann nicht mehr zwingend const.

Ansonsten,

C++:
int const &getNumber() const;


macht mit einem int gerade nur wenig Sinn, allerhöchstens wird der Code dadurch etwas langsamer. Wahrscheinlich auch das nicht, ein moderner Compiler sollte das wegoptimieren können.

C++:
int &getNumber() const;


angeht...also, du kannst keinen Klassenmember zurückgeben, weil die Methode const deklariert ist, und du eine nicht-konstante Referenz zurückgeben willst, in die einer reinschreiben könnte. Mit einer "normalen Variable" meinst du hoffentlich nicht etwas wie

C++:
int &getNumber() const {
  int i = 2;
  return i;
}


...denn das erzeugt undefiniertes Verhalten. i wird am Ende der Funktion zerstört, dementsprechend zeigt deine Referenz ins Leere.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 03.02.2008 um 18:51 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.02.2008, 10:03 Uhr
ao

(Operator)



Zitat von 0xdeadbeef:
Mit einer "normalen Variable" meinst du hoffentlich nicht etwas wie

C++:
int getNumber() const {
  int i = 2;
  return i;
}


...denn das erzeugt undefiniertes Verhalten. i wird am Ende der Funktion zerstört, dementsprechend zeigt deine Referenz ins Leere.


Kleiner Vertipper. Das obige funktioniert bestens, weil keine Referenz, sondern eine Kopie von i rausgereicht wird. Das hier unten macht Ärger:


C++:
int & getNumber() const {
  int i = 2;
  return i;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.02.2008, 18:51 Uhr
0xdeadbeef
Gott
(Operator)


Oh, ja, äh, richtig. Danke. (Fehler behoben)
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.02.2008, 12:39 Uhr
stephanw
localhorst


@nei:

Eine Rückgabe als "const" ist vor allem sinnvoll, wenn Du Zeiger oder Referenzen zurückgibst. Und das wiederum macht man praktisch nur bei Objekten, deren Rückgabe als Kopie zu teuer ist. Ein "int" würde man als Kopie zurückgeben.


C++:

class Foo
{
  std::string name_;
public:
  //...
  const std::string& getName() const
  {
    return name_;
  }
};


Hier wird der Name als Referenz zurückgegeben. Const ist hier sinnvoll, damit niemand über die Referenz den Namen unbemerkt ändern kann. Dann kann auch die Funktion als const deklariert werden.
Trotzdem könnte der Name kopiert werden:

C++:
Foo foo;
const std::string& s = foo.getName(); // s ist konstante Referenz
std::string s1 = foo.getName(); // s1 ist eine Kopie
if (foo.getName() == "bar") // wird über die konstante Referenz gelesen
{
  //
}


--
Reden ist Schweigen und Silber ist Gold.
 
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: