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

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

1

12.07.2010, 20:12

const Zeiger oder Zeiger const

Hi hab eine frag zu Parameter übergabe von Zeiger (also callbyref.)
Wenn ich Parameter übergebe die in der Funktion NICHT verändert werden sollen dann...

C-/C++-Quelltext

1
void set(const Obj& obj);

und wenn ich ein Parameter übergebe der verändert werden soll z.b. als getMethode(oder so)

C-/C++-Quelltext

1
2
 void get(Obj& obj);
 

....dann einfach das const weg lassen.

So jetzt ist mein frage wie sieht es bei den Zeiger aus da gibt es ja 3 möglichkeiten.

C-/C++-Quelltext

1
2
3
void set(const Obj* obj);
void set(Obj* const obj);
void set(const Obj* const obj);

Was davon wäre jetzt das richtige.
Bei den meisten siehe ich "const Obj* obj", aber da ist doch nur der Zeiger konstant, aber nicht der "inhalt".

Sollte man dann lieber Obj* const benutzen wenn man eine constante reference übergeben will.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »kiba« (12.07.2010, 20:19)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

12.07.2010, 20:19

C-/C++-Quelltext

1
2
3
void set(const Obj* obj); //1
void set(Obj const* obj); //2
void set(const Obj* const obj); //3


1 und 2 sind das gleiche und sagen aus, dass das Objekt, auf welches der Zeiger zeigt konstant ist. 3 bedeutet, dass du einen konstanten Zeiger auf ein konstantes Objekt hast.

3 macht aus dem gleichen Grund keinen (nicht viel) Sinn, wie auch das hier:

C-/C++-Quelltext

1
2
int foo (const int n ){}
int bar (int*const pn ){}

Bei foo wird das n ja auch kopiert und kann so gar nichts ausserhalb ändern. Das gleiche gilt für einen Zeiger den Zeiger. Ohne das const könntest du pn zwar ändern, aber Sinn macht es keinen, weil du das ausserhalb sowieso nicht ändern kannst (pn zeigt dann ja nicht mehr auf den gleichen Bereich).

3

13.07.2010, 10:41

Einfach mal bei Gelegenheit lesen, steht viel gutes drin:
http://www.parashift.com/c++-faq-lite/const-correctness.html
Lieber dumm fragen, als dumm bleiben!

4

15.07.2010, 20:04

Vielleicht hast du die Sachen etwas verwechselt, denn die drei (nicht-gleichwertigen) const-Arten für Zeiger lauten:

  • Fred const* p means "p points to a constant Fred": the Fred object can't be changed via p.
  • Fred* const p means "p is a const pointer to a Fred": you can't change the pointer p, but you can change the Fred object via p.
  • Fred const* const p means "p is a constant pointer to a constant Fred": you can't change the pointer p itself, nor can you change the Fred object via p.
Projekt: Welteditor2D

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

15.07.2010, 20:10

Aber um noch etwas Verwirrung zu stiften:

C-/C++-Quelltext

1
2
const Fred* p == Fred const* p
const Fred* const p == Fred const* const p
@D13_Dreinig

6

15.07.2010, 23:12

Ja der springende Punkt ist, ob das const vor oder nach dem * steht: Steht es davor, so kann das referenzierte Objekt nicht verändert werden, egal ob das const vor oder hinter dem Typnamen steht. Der Zeiger selbst darf verändert werden, d.h, auf ein anderes Objekt ausgerichtet werden (welches an sich wiederum über diesen Zeiger unveränderlich ist). Steht das const hintet dem *, so ist der Zeiger konstant, d.h. man darf ihn nicht auf ein anderes Objekt ausrichten. Das Objekt selbst, auf das der Zeiger unverändlich ausgerichtet ist, darf aber verändert werden. Steht vor un d hinter dem * ein const, so darf weder der Zeiger auf ein anderes Objekt ausgerichtet noch darf das referenzierte Objekt über diesen Zeiger verändert werden.

Kurzum liegt der Unterschied darin, ob die Operation p=x oder *p=y (oder beides) für einen Zeiger p verboten werden soll.

So hab ich's zumindest mal gelernt ;)
Projekt: Welteditor2D

Werbeanzeige