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

Beneroth

Alter Hase

  • »Beneroth« ist der Autor dieses Themas

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

1

23.01.2008, 15:17

Ist die Richtlinie zur Parameterübergabe von Heiko oder allg

In Heikos Buch wird bei Parameterübergabe eine Richtlinie aufgestellt (wann welche Art benutzt werden soll):

Übergabe als Wert:
Bei primitiven Typen (int, float, ihr wiss schon) und kleinere objekte die nicht verändert werden

Übergabe als Pointer:
Bei daten die geändert werden sollen

Übergabe als Referenz:
(also konstante referenz??)
wenn object nicht verändert wird


Ich hab das Buch nicht gerade hier und hab ne kleine Diskussion mit dem Lehrmeister ;)
Meine Frage, ist diese Definition eine allgemein bekannte Richtlinie bei der C++-Programmierung, ist es "nur" ein Tipp von Heiko oder eine nur teilweise verbreitete Richtlinie (aber nicht nur die die von Heiko gelernt haben).

Bitte schnell um Antwort, vielen Dank :D

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

23.01.2008, 15:24

Ob man Zeiger oder Referenzen verwendet hängt stark von der jeweiliges Situation und nicht zuletzt von der eigenen Präferenz ab. Primitive Datentypen werden aber im Normalfall einfach "by value" übergeben. Zwar schwören manche darauf diese Typen konstant oder per konstanter Referenz zu übergeben, aber das macht eigentlich kaum Sinn und verwirrt höchstens.

Referenzen sollten verwendet werden, wenn ein Objekt/eine Variable, mit wirkung außerhalb der Funktion, in der Funktion geändert werden soll.

Konstante Referenzen werden bei allen Parametern verwendet die kein primitiver Datentyp sind, nämlich um unnötige Datenkopiererei zu vermeiden.

Zeiger sollten in C++ nur dann genutzt werden wenn Referenzen nicht möglich sind!
@D13_Dreinig

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

23.01.2008, 15:32

Zeiger kann man zum Beispiel dann benutzen, wenn ein Parameter optional ist. Dann setzt man den Standardwert auf 0. Das geht mit Referenzen nicht (so leicht).

4

23.01.2008, 15:43

Naja bei templates würde ich aber nicht noch unter primitiven Datentypen usw. unterscheiden und dann einfach direkt per const-Ref statt value arbeiten!
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

Beneroth

Alter Hase

  • »Beneroth« ist der Autor dieses Themas

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

5

23.01.2008, 15:45

Danke für die Antworten, David und David und Developer :)

Zitat von »"David_pb"«


Konstante Referenzen werden bei allen Parametern verwendet die kein primitiver Datentyp sind, nämlich um unnötige Datenkopiererei zu vermeiden.


Ich habe eben festgestellt das in in einem Fall wie dem hier

C-/C++-Quelltext

1
         void IrgendeineFunktion( IrgendeineKlasse * parameter);


Der Pointer innerhalb der Funktion eine lokale Variable ist, sprich Änderungen (auf den pointer, nicht instanz) sich nicht Auswirken, ausser bei Doppelpointer (**parameter). Jetzt scheint mir das auch logisch, aber musste da erst draufkommen :lol:

Ist das bei Referenzen evtl. anders? Ich glaube nicht, könnte mir nicht vorstellen wie, die adressen von denen sind doch konstant, oder?

Aber was wird konstant bei

C-/C++-Quelltext

1
IrgendeineFunktion(IrgendeineKlasse & parameter)


? Das Objekt oder? Was ist wenn eine Funktion einer Konstanten Referenz aufgerufen wird, geht das dann nur wenn die Funktion keine Membervariable ändert?


Und im Fall dass ich eine Liste von Referenzen habe, von denen je eine Methode aufgerufen wird...sollte da die Referenz konstant sein oder nicht?


:oops: je länger ich darüber nachdenke desto mehr bin ich verwirrt ^^

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

23.01.2008, 15:55

Zitat von »"Beneroth"«

Aber was wird konstant bei

C-/C++-Quelltext

1
IrgendeineFunktion(IrgendeineKlasse & parameter)

Gar nichts, oder siehst du da irgendwo ein const?

Zitat von »"Beneroth"«

Was ist wenn eine Funktion einer Konstanten Referenz aufgerufen wird, geht das dann nur wenn die Funktion keine Membervariable ändert?

C-/C++-Quelltext

1
2
3
4
5
IrgendeineFunktion(const IrgendeineKlasse& parameter)
{
    parameter.machWasDasDichVeraendert(); // <= geht nicht

    parameter.gibDeinenWert(); // geht, wenn "gibDeinenWert" const ist

}


Zitat von »"Beneroth"«

Und im Fall dass ich eine Liste von Referenzen habe, von denen je eine Methode aufgerufen wird...sollte da die Referenz konstant sein oder nicht?

Listen von Referenzen sind nicht machbar.

Zudem solltest du dir über Folgendes im Klaren sein:
Referenzen können nur ein einziges Mal einem Objekt zugewiesen werden, und zwar direkt bei der Initialisierung. Danach nie wieder! Man kann eine Referenz nicht nachträglich auf ein anderes Objekt zeigen lassen:

C-/C++-Quelltext

1
2
3
4
int einInt = 42;
int nochEinInt = 43;
int& referenzAufEinenInt = einInt;
referenzAufEinenInt = nochEinInt; // hier wird "einInt" geändert, nicht die Referenz


Eine Referenz verhält sich genau wie das Objekt, auf das sie zeigt. Du kannst die Referenz nicht mehr vom Objekt unterscheiden. Das ist bei Zeigern anders.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

23.01.2008, 15:57

Zitat von »"David Scherfgen"«

[...] Das geht mit Referenzen nicht (so leicht).


och...

C-/C++-Quelltext

1
2
3
4
5
void foo(blub& x);

// ...


foo(*((blub*)0));


:badgrin:

Beneroth

Alter Hase

  • »Beneroth« ist der Autor dieses Themas

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

8

23.01.2008, 16:05

Zitat von »"David Scherfgen"«

Zitat von »"Beneroth"«

Aber was wird konstant bei

C-/C++-Quelltext

1
IrgendeineFunktion(IrgendeineKlasse & parameter)

Gar nichts, oder siehst du da irgendwo ein const?


nö, habs vergessen :oops: :x

Zitat von »"David Scherfgen"«

Listen von Referenzen sind nicht machbar.

hm..stimmt...ich hab nen struct verwendet indem eine referenz war, aber nicht die referenz ist das listenelement...

@dot:
Hehehe..sehr bös, aber das kannte ich sogar :lol:

Aber die Adresse von ner Referenz ist immer ne Konstante. Und bei konstanten referenzen können nur konstante methoden aufgerufen werden.

so richtig?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

23.01.2008, 16:15

Zitat von »"Beneroth"«

Aber die Adresse von ner Referenz ist immer ne Konstante.


nicht ganz. pointer auf referenzen sind illegal. sowas wie die adresse einer referenz gibts nicht (kann man sprachlich auch gar nicht ausdrücken). überleg dir folgendes:

C-/C++-Quelltext

1
2
3
4
blub a;
blub& foo = a;
blub&* p = &foo;  // foo ist eine referenz auf a. &foo gibt die adresse von a...

// pointer auf referenzen haben schon allein darum keinen sinn


referenzen sind immer konstant, deswegen macht eine konstante referenz auch keinen sinn:

C-/C++-Quelltext

1
blub& const r = foo;  // sinnlos


Zitat von »"Beneroth"«

Und bei konstanten referenzen können nur konstante methoden aufgerufen werden.


man kann generell auf konstanten objekten nur konstante methoden aufrufen. hast du eine referenz auf ein solches objekt gilt das natürlich weiterhin ;)

C-/C++-Quelltext

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

// ...


const blub obj;
obj.foo();  // FEHLER


const blub& a = obj;
a.foo();  // immer noch falsch ;)


blub& b = const_cast<blub&>(a);  // laserschwertmethode

b.foo();  // kompilliert, aber undefiniertes verhalten...


Zitat von »"Deviloper"«

Naja bei templates würde ich aber nicht noch unter primitiven Datentypen usw. unterscheiden und dann einfach direkt per const-Ref statt value arbeiten!


oder traits verwenden...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

23.01.2008, 20:04

Zitat von »"dot"«

Zitat von »"David Scherfgen"«

[...] Das geht mit Referenzen nicht (so leicht).

och...

C-/C++-Quelltext

1
...

Dessen war ich mir bewusst, darum das "so leicht" in Klammern :)

Werbeanzeige