Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.06.2004, 13:50

Konstante Parameter und konstante Rückgabewerte

Falls du schon genug dumme Fragen heute gelesen hast, dann les diesen Post lieber nicht weiter.
Aber ich bin mir bei der Sache wirklich nicht sicher und Fragen ist da immer die Beste Hilfe!

Sehen wir uns folgende Fälle an:
1.) const float getSpeed();
2.) void setSpeed(const float fSpeed);


Und jetzt meine Verständnisprobleme:
1.) Hier bewirkt das const doch, dass der Rückgabewert konstant ist, d.h. er kann im weiteren Programm nicht verändert werden. Das würde für mich Sinn machen, da ich mit einer get-Methode i.d.R. eine Member Variable Abfrage und es unsinnig wäre diese im Programm zu ändern, jedenfalls nicht ohne eine dazugehörige set-Methdoe.
2.) Das const in der Signatur bewirkt doch das der Parameter konstant ist, d.h. er kann im Laufer der Methode nicht verändert werden. Auch das macht für mich Sinn, da ich ja mit der set-Methode von außen eine Member Variable verändern möchte und dann sollte ich dich auch nicht in der Methode verändern.

Fazit:
Ich hoffe meine Annahmen stimmen und wenn nicht, dann würde ich mich freuen, wenn mir jemand weiterhelfen könnte.
Warum eigentlich diese Frage, ich habe gelesen das man dadurch schnelle Fehler finden kann bzw. Fehler vermeiden und irgendwie klingt das logisch, aber dazu muss man auch die Bedeutung verstehen.

so long

Anonymous

unregistriert

2

02.06.2004, 16:54

Re: Konstante Parameter und konstante Rückgabewerte

zu 1: sowas hab ich noch nie gesehen ob das geht weiss ich nicht

zu 2: da hast Du vollkommen recht
sinnvoll sind auch so sachen wie
<const tbModell &Modell> in den Parametern der Funktion, dann wird keine neue Variable tbModel angelegt, sondern nur die Adresse übergeben (Geschwindikeits & Speicher - Gewinn) aber dennnoch nicht wie bei einem Zeiger, die Variable bleibt weiter innerhalb der Funktion unveränderlich

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

3

02.06.2004, 18:42

Hi,

zu 1.: Das geht, nur naja diese schreibweise macht man bei den Pros nur bei templates. z.B. so:

Quellcode

1
2
3
4
5
6
7
8
9
10
    template<typename A, typename T> __forceinline const A lexical_cast(const T& source) 
    {
        std::stringstream s;
        s << source;

        A destination;
        s >> destination;

        return (destination);
    }


aber bei normalen Funktionen wie get schreibt mans so:

Quellcode

1
2
3
4
5
6
__forceinline float FastSqrt (const float value) const;
// [...]
__forceinline float FastSqrt (const float value) const
{
      return (ISSE implementierung);
}


Warum das so ist, weiß ich nicht genau, aber in jeden Professionellen code den ich bisher gesehen habe, wird das so gemacht.

Fragt mich nicht wieso, aber ich habe mich schon dran gewöhnt :)

Fakt ist jedoch eines: man kann nie genug const haben ;)

Achja zum Thema Referenzen: Referenzen machen NUR bei Objekten Sinn, wie z.B. bei einer Klasse oder einem STL Mitglied. bei Buildintypes, ist das ein Nachteil und bringt nichts, im gegenteil..

4

03.06.2004, 00:02

Also, ich weiss ja nicht wer die Pros sind, aber Bruce Eckel sagt:

Zitat



For built-in types, it doesn’t matter whether you return by value as a const, so you should avoid confusing the client programmer and leave off the const when returning a built-in type by value.

Returning by value as a const becomes important when you’re dealing with user-defined types. If a function returns a class object by value as a const, the return value of that function cannot be an lvalue (that is, it cannot be assigned to or otherwise modified).

......

Only a non-const return value can be used as an lvalue. Thus, it’s important to use const when returning an object by value if you want to prevent its use as an lvalue.

The reason const has no meaning when you’re returning a built-in type by value is that the compiler already prevents it from being an lvalue (because it’s always a value, and not a variable). Only when you’re returning objects of user-defined types by value does it become an issue.



Mehr dazu im Kapitel 8: Constants. Das Buch gibts kostenlos auf seiner Seite zum Download.
[/quote]

5

03.06.2004, 00:12

Ach ja, fast hät ich`s vergessen:

class X {
int i;
public:
X(int ii);
int f() const;
};


X::X(int ii) : i(ii) {}
int X::f() const { return i; }


f ist eine Membermethode und verändert das entsprechende Objekt nicht, kann also auch für const Objekte aufgerufen werden.

Auch hier wieder BrutzelEckel:

Zitat


Any function that doesn’t modify member data should be declared as const, so it can be used with const objects.

6

03.06.2004, 05:19

@blueEye:
1) Naja, für das gesamte Programm würde ich nicht sagen. Aber auf jedenfall für die Variable die den Rückgabewert entgegen nimmt. Normalerweise werden die Rückgabewerte einer Get-Methode aber weiter verarbeitet und daher ist es besser wenn der Rückgabe Typ nicht const ist.

2) Da hast du recht. Der Parameter (in deinem Beispiel fSpeed) ist in der gesamten Funktion/Methode nicht veränderbar. Konstante Parameter machen aber vor allem Sinn weil man dann besser erkennen kann, welcher Parameter von der Funktion/Methode verändert wird und welcher nicht. Bei Klassen sollte man aber vorsichtig sein.

Zitat

const tbModell &Modell
Bei einem Konstanten Objekt, ob nun als Referenz oder als Zeiger, kann man nur Konstante Methoden aufrufen. Das macht in sofern Sinn, damit man sicherstellen kann, daß das übergebene Objekt nicht in der Funktion/Methode verändert werden kann.

@Patrick:
Ich denke __forceinline dürfte klar sein, was das bewirkt. Das const hinter den Methoden bewirkt das die Member-Variablen der Klasse nicht in dieser Methode verändert werden können. War es das was du nicht wustest?
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige