Diskussion:C++-Programmierung/ Weitere Grundelemente/ Referenzen

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Zweites Beispiel[Bearbeiten]

Die neuzuweisung auf a ist bei der Ausgabe nicht ersichtlich. Weil bei der nächsten Ausgabe sowohl a als auch b den Wert 20 haben. Vielleicht kann man den Wert b ändern um es einfacher zu machen --87.150.21.248 21:21, 24. Jan. 2013‎ (CET) (Unterschrift nachgetragen --Prog 17:31, 27. Jan. 2013 (CET))Beantworten[Beantworten]

a und b müssen doch den selben Wert haben, weil r den wert von b zugewiesen bekommt und r ja nur ein Referenz auf a ist. --92.196.34.106 21:39, 24. Jan. 2013 (CET)Beantworten[Beantworten]
gut danke. Dann hab ich das jetzt auch verstanden, wie das gemeint ist. --87.150.21.248 08:54, 27. Jan. 2013‎ (CET) (Unterschrift nachgetragen --Prog 17:31, 27. Jan. 2013 (CET))Beantworten[Beantworten]

Stimmt das?[Bearbeiten]

Im Beipiel steht:

CMyClass::CMyClass(CMyClass& rMyClass)

Steht der Referenzoperator & richtig? Muss es nicht vielmehr

CMyClass::CMyClass(CMyClass &rMyClass)

heißen?

Das ist Geschmackssache. Der Compiler akzeptiert beides. --Sliver 17:37, 16. Aug 2005 (UTC)

Der Compiler schon, ich nicht. Als Anfänger habe ich mühe, solche kleinen 'Geschmackssachen' zu verstehen. Ich glaube, das leuchtet ein. Gruss, o.z.

Du kannst

int* a,b,c;

oder

int *a,b,c;

schreiben. Von welchem Typ sind a,b,c jeweils? Oben haben wir 3 Zeiger, Unten ist nur a ein Zeiger, b und c sind normale int-Variablen. Bei Referenzen verhält sich das analog.

Nein, in beiden Fällen ist a ein Zeiger, b und c sind int. Abstände zwischen Token werden vom Compiler ignoriert (im Prinzip bräuchte man sie nur dort, wo sonst andere Token entstünden, z.B. bei "intmain" statt "int main"). Die folgenden Deklarationen sind also alle äquivalent:
int*a,b,c;
int* a, b, c;
int *a, b, c;
int * a , b , c ;
int
*
a
,
b
,
c
;
Allerdings definiert folgendes drei Zeiger:
typedef int *iptr;
iptr a, b, c;
Generell ist es in C++ eine gute Idee, nur eine Variable auf einmal zu defnieren, dann gibt es keine Missverständnisse:
int* a;
int b;
int c;
Die Deklarationssyntax ist der schlechteste Teil von C++ (und C). --85.179.84.133 16:53, 17. Mai 2007 (CEST)Beantworten[Beantworten]

Kapitel gekürzt[Bearbeiten]

Der Abschnitt Anwendung enthält ein ausführliches Codebeispiel mit Klassen, Copy-Konstruktor und Zuweisung. Auf dem gegenwärtigen Wissensstand kann der Leser damit überhaupt nichts anfangen. Dieser Teil wurde vorläufig herauskommentiert, vielleicht kann er ins Kapitel über Klassen eingearbeitet werden. Der Abschnitt Wozu dienen die Referenzen? ist hingegen einfach nur redundant und sollte ersatzlos gestrichen werden. --Bernina 15:44, 21. Sep 2006 (CEST)

Sinn des Anwendungsbespiels?[Bearbeiten]

Ich hätte da zwei Fragen:

1. Warum ist der Rückgabewert der Funktion nicht void?

2. Wozu brauche ich den in diesem Fall überhaupt Referenzen? Meiner Ansicht nach wäre es einfacher sie einfach wegzulassen, dann braucht man auch den const-Teil nicht.

Call-By-Reference[Bearbeiten]

call-by-reference ist keine Neuerung von C++ gegenüber C. Funktionsaufrufe mit Adressen zu Variablen, kennt C sehrwohl auch: http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_014_005.htm#Xxx999331

sorry, I could not resist[Bearbeiten]

Entschuldige, dass ich schon wieder in deinen halbfertigen Kapiteln herumeditiere. Hab den Hinweis erst nach meinen Änderungen gelesen. Bitte nicht böse sein. Ich lasse erstmal die Finger davon und warte, bis du mit deinen Änderungen fertig bist. --RokerHRO 13:28, 10. Mär. 2008 (CET)Beantworten[Beantworten]

Ich hatte den Hinweis auch erst nach deiner Änderung gesetzt, weil ich wiederum mit deinem Edit in Konflikt geraten bin. Für den Moment bin ich mit meinen Umverteilungen erst mal fertig, du darfst jetzt gerne drüber „meckern“, korrigieren und verbessern. ;-) Viele Grüße --Prog 15:23, 10. Mär. 2008 (CET)Beantworten[Beantworten]
Seit meiner letzten Änderung ist ja anscheinend nix mehr passiert. Nunja, ich mach erstmal Feierabend. --RokerHRO 16:14, 10. Mär. 2008 (CET)Beantworten[Beantworten]

Verständnisproblem - Grundlagen zu Referenzen[Bearbeiten]

Ich verstehe diese Aussage nicht:

 Im Beispiel wurde die Referenz auf int r, mit dem int a initialisiert.

Ich verstehe den Begriff Referenz als Verweis ( http://de.wikipedia.org/wiki/Referenz_%28Programmierung%29 ). Dann hieße das, dass im Beispiel der Verweis auf int r mit etwas initialisiert würde. Ist es nicht so, dass int r selbst der Verweis auf int a ist? Vielleicht denke ich etwas kompliziert, aber würde der Satz folgendermaßen lauten, würde ich ihn verstehen:

 Im Beispiel wurde die Referenzvariable int r mit int a (und damit auch dem Wert von int a) initialisiert.

Ronsn 18:56, 24. Mär. 2008 (CET)Beantworten[Beantworten]

Nachtrag: Zum zweiten Beispiel:

 Wie Sie sehen, ist es nicht möglich, r als Alias für b zu definieren,
 nachdem es einmal mit a initialisiert wurde.

Wo genau sieht man das?

Ronsn 23:05, 24. Mär. 2008 (CET)Beantworten[Beantworten]

Eine Referenz ist ein Aliasname für eine Variable. Vielleicht sind meine Formulierungen etwas kompliziert gewählt, über eine Verbesserung freue ich mich immer. Allerdings würde deine Aussage nicht ganz stimmen: int r wird nicht mit Wert von int a initialisiert, sondern viel mehr mit dessen Adresse.
Referenzen sind in C++ eigentlich nichts weiter als konstante Zeiger auf Typ (Typ * const Referenzname) die mit der Syntax normaler Variablen verwendet werden. Ein Initialisierung ist daher immer erforderlich. Bei der Initialisierung einer Referent wird festgelegt, auf welche Variable verwiesen werden soll.
Bezüglich deines Nachtrags habe ich einen Kommentar im Quelltextbeispiel ergänzt, der die Stelle anzeigt.
Viele Grüße (ps: Ich hab im moment Stress, deshalb brauchen meine Antworten zum Teil lange, bitte nicht Böse sein) :) --Prog 13:58, 8. Apr. 2008 (CEST)Beantworten[Beantworten]

Verständnisproblem 2[Bearbeiten]

Wäre der int in ausgabe2() nicht konstant, also eine normale Referenz auf int, könnte man ausgabe2() 
nur mit einer Variable aufrufen, denn die Zahl 5 ist ja ein konstanter int-Literal.

Das kommt leider überhaupt nicht rüber. Der zu dem Beispiel einleitende Text ist auch komisch, spricht von *zwei* Variablen und zeigt dann nur eine.

In Verbindung mit Klassenobjekten ist diese Art der Übergabe sehr viel schneller, dazu erfahren Sie aber zu gegebener Zeit mehr. 
Für die eingebauten Datentypen, die Sie bisher kennen, ist tatsächlich die Übergabe als Wert effizienter.
Der Text danach hängt irgendwie zusammenhangslos am Beispiel.

77.132.179.27 03:44, 4. Aug. 2008 (CEST)Beantworten[Beantworten]

Hab's ein wenig überarbeitet, hoffe es ist jetzt verständlicher. --Prog 15:58, 4. Aug. 2008 (CEST)Beantworten[Beantworten]

Anwendung von Referenzen -> Selbstdefinierte Referenzen[Bearbeiten]

Sorry, aber mir ist nicht klar was das Beispiel eigentlich genau tut oder was "size_t" für ein Typ ist. Eventuell wäre ein bisschen erklärender Text an dieser Stelle hilfreich! :D

(Ja, ich hab's mal durchlaufen lassen, allerdings ergibt es nur eine massive Folge von ?zufälligen? Zahlen. Hatte zuerst gedacht, es handele sich einfach nur um einen Iterator über das Array, aber da liege ich glaube ich falsch) --88.70.68.168 18:39, 28. Jul. 2010 Unterschrift nachgetragen --Prog 01:02, 1. Aug. 2010 (CEST)Beantworten[Beantworten]

(Die Frage bezog sich auf die Version 18:41, 28. Jul. 2010)
Da liegst du schon richtig, die Schleifen iterieren über das Array. Selbiges enthielt aber nur Zufallszahlen, da es nicht initialisiert wurde. Genaugenommen enthielt es also die Werte, die zum Zeitpunkt der Programmausführung noch zufällig in dem Speicherbereich standen, der dem Array zugewiesen wurde. Hab das ganze mal etwas überarbeitet. Was size_t angeht so handelt es sich um ein typedef für einen Ganzzahligen (typischerweise positiven) Typ, welches in der Headerdatei cstddef im Namensraum std definiert ist. Was size_t konkret ist wird vom C++-Standard nicht festgelegt, auf meinem System handelt es sich zum Beispiel um einen unsigned long. Folgender Code-Schnippsel sollte deinen Linker veranlassen eine Fehlermeldung zu generieren, aus der du den Typ ablesen kannst:
#include <cstddef>
template < typename T > void test(T);
int main(){
    std::size_t t;
    test(t);
}
PS: Unterschreibe deine Beiträge bitte mit --~~~~ ;) Gruß --Prog 01:02, 1. Aug. 2010 (CEST)Beantworten[Beantworten]