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

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

19.10.2007, 21:44

const

kann mir jemand die unterschiede folgender zeilen erkären?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
    const char& operator[](size_t pos) const
    { return pos; }

    char& operator[](size_t pos) const
    { return pos; }

    char& operator[](size_t pos)
    { return pos; }


bei der ersten anweisung verstehe ich nicht warum const nach dem funktionskopf da steht, und was das dann genau bewirkt..

bei der zweiten würd mich ebenfalls interessieren was da jetzt genau passiert..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Toa

Alter Hase

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

2

19.10.2007, 21:51

Das erinnert mich an ein Beispiel :

Ich versuche dir das ganze mit Zeigern zu erklären, ich hoffe ich mache jetzt keinen Bockmist xD

Also :


ALso man kann das Schlüsselwort Const vor oder nach dem Typ(oder an beiden Stellen) verwenden.

Hier ma Gültige Deklarationen:

Quellcode

1
2
3
const int* pEins;
int *const pZwei;
const int *const pDrei;


Erklärung :

pEins ist ein Zeiger auf einer Konstanten Ganzzahl.Der Wert auf den er zeigt lässt sich nicht über den Zeiger ändern.

pZwei ist ein konstanter Zeiger auf einer Ganzzahl. DIe Ganzzahl kann man ändern, aber pZwei kann nicht auf etwas anderes zeigen.

pDrei ist ein Konstanter Zeiger auf eine Konstante Ganzzahl.Hier läßt sich weder der Wert ,auf den der Zeiger verweist,noch kann man pDrei durch eine erneute Zuweißung auf etwas anderes zeigen lassen


Hoffe du kannst das ganze auf dein Problem zurückführen.

MFG Toa [/code]

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

3

19.10.2007, 22:48

nicht ganz..

was bedeutet dann das const NACH dem funktionskopf?

C-/C++-Quelltext

1
2
char& operator[](size_t pos) const
    { return pos; }


macht das jetzt den rückgabewert const?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

19.10.2007, 22:51

Re: const

Zitat von »"Toa"«

Ich versuche dir das ganze mit Zeigern zu erklären, ich hoffe ich mache jetzt keinen Bockmist xD


keine angst. das was du erklärt hast ist richtig ;)

Zitat von »"$nooc"«

kann mir jemand die unterschiede folgender zeilen erkären?

C-/C++-Quelltext

1
2
    const char& operator[](size_t pos) const
    { return pos; }



das const nach der parameterliste zeichnet die ganze funktion als const aus. sowas ist nur gültig bei memberfuntionen einer klasse. es bedeutet, dass diese funktion das objekt für das sie aufgerufen wird nicht verändert. hast du ein konstantes objekt, kannst du nur const funktionen darauf aufrufen. kurzes bsp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class foo
{
public:
  void func1();
  void func2() const;
};

//...


foo obj1;

obj1.func1(); // ok

obj1.func2(); // ok


const foo obj2;

obj2.func2(); // ok

obj2.func1(); // nicht ok, die funktion foo1 ist nicht const, das objekt aber schon


im allgemeinen kannst du in einer solchen funktion keine member des objektes verändern (außer diese sind als mutable deklariert).

Zitat von »"$nooc"«


C-/C++-Quelltext

1
2
    char& operator[](size_t pos) const
    { return pos; }



fast das gleiche wie die vorige funktion, nur mit dem unterschied, dass der rückgabewert nicht const ist. diese deklaration ist ziemlich widersprüchlich, denn jetzt bekommt der aufrufer dieser funktion eine referenz auf die membervariable (non-const) und kann diese nach lust und laune verändern.

Zitat von »"$nooc"«


C-/C++-Quelltext

1
2
    char& operator[](size_t pos)
    { return pos; }



das deklariert den operator[] nochmal, jetzt non const. da das const hinter der parameterliste teil der signatur ist, wird es auch beim overloading berücksichtigt.
folgendes bsp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class foo
{
private:
  int x[10];
public:
  int operator [](int index) const { return x[index]; }  // const version

  const int& operator [](int index) { return x[index]; }
  
};

// ...


foo obj1;

obj1[8] = 10;  // geht, objekt ist non-const daher 

               // wird der non-const operator aufgerufen

               // dieser liefert eine referenz auf das 

               // arrayelement und daher funktioniert die

               // zuweisung



const foo obj2;

obj2[8] = 10;  // geht nicht. es wird der operator [] const 

               // aufgerufen. der liefert aber keinen wert

               // an den man etwas zuweisen kann (kein "L-value")



int a = obj1[2];  // geht beides, da beide varianten von operator []

int b = obj2[3];  // einen wert der gelesen werden kann liefern

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

20.10.2007, 00:11

Zitat


C-/C++-Quelltext

1
2
3
4
5
obj1[8] = 10;  // geht, objekt ist non-const daher

               // wird der non-const operator aufgerufen

               // dieser liefert eine referenz auf das

               // arrayelement und daher funktioniert die

               // zuweisung



Sicher? :shock:
@D13_Dreinig

6

20.10.2007, 00:19

Ehm nein sollte der nicht schlucken ^^ der müsste die Version nehmen, wo er const int& zurückgibt ... damit hast du ein Problem :P Und selbst wenn er den const-operator nimmt, sollte er es einfach wegoptimieren :P
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

7

20.10.2007, 10:36

jetz hatte ich kurz den "Aha!" effekt, und dann les ich das letzte comment.. und alles is wieder kaputt :D

also was von den beispielen is jetzt richtig?

danke übrigens für die ausführliche antwort! :)
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

20.10.2007, 17:58

Das Problem ist einfach nur die konstante Referenz die zurückgegeben wird. Folgendes geht problemlos:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class foo
{
private:
  int x[10];
public:
  int operator [](int index) const { return x[index]; }  // const version

  int& operator [](int index) { return x[index]; }
 
};
@D13_Dreinig

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

9

20.10.2007, 18:43

Es gibt noch eine besonderheit bei const-methoden. diese können nur andere const-methoden aufrufen und keine nicht-const methoden. versuchst dus trotzdem schlägt dich der compiler.

Socke

10

20.10.2007, 19:41

Zitat

Es gibt noch eine besonderheit bei const-methoden. diese können nur andere const-methoden aufrufen und keine nicht-const methoden. versuchst dus trotzdem schlägt dich der compiler.


statische Methoden kann man selbstverständlich trotzdem aufrufen auch wenn sie nicht Konstant sind!
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

Werbeanzeige