effizientes c++ auch ohne zeiger??
-
@bulli:
gOo0gle Suche nach:
c++-faq-lite referencesund dann nachlesen unter "Underneath it all ..."
Referenzen sind eben kein anderes Konzept als Zeiger, sie heißen nur anders und haben eine andere Syntax.
-
Bei...
int a = 3; int &b = a;...wird doch keine Zeigervariable angelegt. Der Compiler sieht b als a.
Also nix Zeiger.
-
u_ser-l schrieb:
Referenzen sind eben kein anderes Konzept als Zeiger, sie heißen nur anders und haben eine andere Syntax.
Genau, das macht Sinn!

-
The nitpicking feast is open.

-
nach Eurer Argumentation müßte dann 0x10+0x1 etwas Anderes sein als 16+1.
Der Compiler macht aber aus beidem dasselbe add.
"andere Syntax => anderes Konzept" gilt eben nicht immer, besonders nicht in einer Syntaxregel-reichhaltigen Sprache wie C++, wo mehrfach dasselbe Konzept in verschiedene Syntax eingekleidet ist. printf und cout << ist ja auch nicht wirklich etwas Anderes, obwohl die Syntax verschieden ist.
-
C++ Ebene != CPU Ebene
Ich kann mich nur wiederholen. Wenn du es von der Hardware aus anschaust, vom kompilierten Code her, dann kann man nicht auf Zeiger verzichten, das ist korrekt. Aber dem Threadersteller ging es um die Zeiger in C++, also der Programmiersprache C++ und nicht das was nach dem Kompilieren herauskommt. Und wenn wir auf der Ebene von C++ bleiben, dann kann man auf Zeiger verzichten und dann sind Referenzen keine Zeiger. Punkt und aus.
Grüssli
-
u_ser-l schrieb:
nach Eurer Argumentation müßte dann 0x10+0x1 etwas Anderes sein als 16+1.
Man kann auch Worte nach belieben im Munde herumdrehen. Fakt ist, das Referenzen keine Zeiger sein müssen, und in der Praxis auch je nach Compiler/Optimierung nicht sind.
Wenn ich schreibe:
int a = 1;
int * b = &a;erwarte ich das zwei Speicherbereiche belegt werden (Einmal der Wert, einmal die Adresse).
Im Falle von:
int a = 1;
int & b = a;Ist es aber voraussichtlich nur ein Speicherbereich (Der Wert), der im Programmcode über zwei Namen angesprochen werden kann.
cu André
-
Dravere schrieb:
Aber dem Threadersteller ging es um die Zeiger in C++, also der Programmiersprache C++ und nicht das was nach dem Kompilieren herauskommt.
Der TE sagte aber "... komplett auf Zeiger verzichten" und nicht: "... auf * und & verzichten".
Dravere schrieb:
Und wenn wir auf der Ebene von C++ bleiben, dann kann man auf Zeiger verzichten
und wie öffnest Du in C++ ein File ohne char* ?
Grüße
-
asc schrieb:
Im Falle von:
int a = 1;
int & b = a;Ist es aber voraussichtlich nur ein Speicherbereich (Der Wert), der im Programmcode über zwei Namen angesprochen werden kann.
ja, das ist eine syntaktische Sache, die auf der Maschinenebene wahrscheinlich nicht abgebildet wird. Das hatten wir doch schon.
Erinnert etwas an Hütchenspielerei - ein Syntaxkonstrukt veranschaulichen mit einem Beispiel, bei dem der Compiler just dieses Konstrukt ins Nichts wegoptimiert.
Bei
void foo(bar& aBar)kann der Compiler aber nicht wegoptimieren und übergibt einen Zeiger.
Wir streiten uns hier über ein syntaktisches Konstrukt "&", das in C++ mehrere verschiedene Bedeutungen hat - u.a. Umbenennung von Variablen, Referenzparameter, ...
Ehrlich gesagt, hätte ich jetzt lieber einen freien Rest-Sonntag, ciao.
-
Ja, der TE sollte mal genauer formulieren...
u_ser-l schrieb:
und wie öffnest Du in C++ ein File ohne char* ?
Nicht die C++ -STDLib nutzen.
-
u_ser-l schrieb:
Der TE sagte aber "... komplett auf Zeiger verzichten" und nicht: "... auf * und & verzichten".
Du solltest mal die Beschreibung dieses Forums lesen. Wir sind hier im C++ Forum, also der Programmiersprache C++. Wenn hier jemand "komplett auf Zeiger verzichten" schreibt, dann nehme ich logischerweise an, dass er damit meint, dass er auf die Zeiger in der Programmiersprache C++ verzichten will. Sonst ist er schlicht und einfach gesagt im falschen Forum!
Es macht auch keinen Sinn, wieso jemand auf Zeiger verzichten möchte, welche ihn gar nicht stören, da er sie gar nie sieht ... :pu_ser-l schrieb:
und wie öffnest Du in C++ ein File ohne char* ?
std::string path; std::fstream file(path.c_str());Ich habe selber nie ein
char const*verwendet! Konnte persönlich also vollständig darauf verzichten.
Und im neuen Standard kann man ja dann auch sogar das folgende machen, falls du wirklich so ein Erbsenzähler bist:std::string path; std::fstream file(path);Grüssli
-
Dravere schrieb:
Es macht auch keinen Sinn, wieso jemand auf Zeiger verzichten möchte, welche ihn gar nicht stören, da er sie gar nie sieht ... :p
langsam verstehen wir uns

Das ist wie mit den bugs - man sieht sie nicht, und doch sind sie da.
Jetzt aber schönen Sonntang noch.
-
@u_ser-l!
Dann ist wohl a und b hier auch für dich das gleiche?int a = 100; int b = 0100;Nach deiner Argumentation sind beide gleich, da der Compiler daraus Dezimalwerte macht. Wo würden wr denn in Zukunft hinkommen, wenn eh alles angeblich gleich sein soll, nur weil am Ende im Speicher alles als Bits abgebildet wird. Weißt, mich als C++-Programmierer interessiert das was der COmpiler macht, nur zweitrangig. Wenn man mit anderen Menschen kommuniziert, muß man sich an Regeln halten. Und wir reden hier C++...
-
In C++ haben nun mal oft mehrere verschiedene Konzepte gleiche Syntaxelemente: '&' für Ref.Var., '&' für Ref.Parameter, '&' für 'und', '&' für ...
ähnlich auch bei 'static', '>>' usw.- andererseits werden gelegentlich gleiche Konzepte durch verschiedene Syntaxelemente (z.B. Zeiger *und* Referenzen für die Argumentübergabe 'by reference') repräsentiert.
Daß bei C++ keine eindeutige Zuordnung zwischen Konzepten und Syntaxelementen vorliegt, erschwert eine Diskussion wie diese hier.
Aber das ist nun ein Thema, das nicht mehr in's "C++"-Forum gehört.
-
Ihr wisst schon dass Ihr alle total am Thema vorbei schreibt?
Macht doch einfach einen Thread auf mit der Überschrift "sind Referenzen Zeiger?".Also zum Thema (und ich beziehe mich auf objektorientiertes Programmieren):
- Streng genommen:
Nein. Man kann so ja nichtmal this benutzen, denn this ist ein Zeiger. Oder wie schon genannt Arrays wie "hallo welt".- Nicht ganz so streng genommen:
Teilweise. Ich versuche selber auf Zeiger zu verzichten. Mit oben genannten Ausnahmen natürlich. Der Grund liegt in stabileren Programmen, da die meisten Fehler von Nullzeigern oder Zeigern die auf falsche Stellen im Speicher weisen. Meine Erfahrung ist dass Referenzen bzw. einfach lokale Variablen oder Klassenvariablen zu *sehr* viel stabileren Programmen führen. Sowas bekommt man bei hoher Zeigernutzung nie hin. Arrays kann man übrigens in Vectoren oder ählichen Klassen ablegen. Sehr stabil und man weiß auch immer die Größe.
Nur eines geht meines Wissens überhaupt nicht. Und zwar abgeleitete Klassen.
Wenn man schreibtAbgeleiteteklasse c;
Basisklasse b = c;dann hat man mit "b" nicht wie in Java z.B. ein Objekt vom Typ "Abgeleiteteklasse". Das ist richtig übel. Man muß in dem Fall mit Zeigern arbeiten. Auch Referenzen bringen einen nicht weiter.
Beispiel mit Zeiger:Abgeleiteteklasse c;
Basisklasse * b = new Abgleiteteklasse(c);Das wäre dann korrekt. Man hätte so auch bei "b" den Typ "Abgleiteteklasse".
Referenzen bringen einen hier auch nicht mehr weiter:Wenn man schreibt
Abgeleiteteklasse c;
Basisklasse b = c;dann hat man mit "b" nicht wie in Java z.B. ein Objekt vom Typ "Abgeleiteteklasse". Das ist richtig übel. Man muß in dem Fall mit Zeigern arbeiten. Auch Referenzen bringen einen nicht weiter.
Beispiel mit Zeiger:Abgeleiteteklasse c;
Basisklasse & b = c;Funktioniert zwar wenn einem ein Alias reicht. Aber wenn man das Objekt klonen will hilft einem nur noch ein "new" weiter.
Oder gibt es eine Möglichkeit wie man das Problem ohne new lösen kann? Ich glaube aber nicht.
-
Sorry, ein Absatz ist doppelt. Keine Ahnung warum. Ich kann leider nicht editieren.
Und weiter unten sollte es heißen "Beispiel mit Referenz". Leider steht da "Beispiel mit Zeiger".
-
Granini schrieb:
Wenn man schreibt
Abgeleiteteklasse c;
Basisklasse b = c;dann hat man mit "b" nicht wie in Java z.B. ein Objekt vom Typ "Abgeleiteteklasse".
Im Gegensatz zu C++ wo Referenzen unter gewissen Umständen nur ein Aliasname sind, ist in Java eine Referenz eindeutig ein Zeiger mit anderer Syntax (null ist Zulässig; Die Häufigste Exception die ich aus Javaprogrammen kenne ist die Nullpointer-Exception [oder wird sie NullReference genannt?]...). Zudem macht Java bei Objekten immer eine Referenzübergabe (Eine Änderung an einen übergebenen Objekt ändert das Orginal).
In diesen Fall vertrete ich Ausnahmsweise mal die Linie von user_l.
cu André
P.S: Diese Null-Exception unter Java ist für mich auch einer der Beweise, warum man auch mit Sprachen wie Java und C# durchaus wissen sollte was man macht...
-
Granini schrieb:
Funktioniert zwar wenn einem ein Alias reicht. Aber wenn man das Objekt klonen will hilft einem nur noch ein "new" weiter.
Oder gibt es eine Möglichkeit wie man das Problem ohne new lösen kann? Ich glaube aber nicht.
Wenn du Polymorphie brauchst und ein Objekt kopieren willst, ist
newschon naheliegend. Falls dir aber das Aufräumen zu mühsam ist, kannst du Smart Pointers verwenden. Und immer schön dran denken, Destruktor virtuell zu machen.
Aber Zeiger gehören nun mal zu C++. Wenn man sich für diese Programmiersprache entscheidet, nimmt man auch die Zeiger in Kauf. Sie bieten einem ausserdem sehr viele Möglichkeiten, auch wenn sie fehleranfällig sind. Man muss sie halt nicht exzessiv einsetzen, sondern wo möglich auf Container, Smart Pointer und andere Hilfsmittel ausweichen.
-
Ich könnte mir keine Programmierwelt ohne Zeiger vorstellen. Und damit meine ich auch die Fälle, in denen ich zwar selber keine benutze, aber weiß, dass die Klassen, die ich verwende, diese benutzen. Für mich würde es auch keinen Unterschied machen, wenn die Klassen zwar soetwas nicht betreiben würden, aber dafür die "Sprache" im Hintergrund. Ohne geht es einfach nicht. Nirgendwo. Man sollte aber bestrebt sein, die Verwendung von Zeigern so oft wie möglich gut getesteten Bibliotheken (oder halt "Sprachen") zu überlassen oder einfach keine Fehler machen

Ich denke, dass der TE auch eher wieder einen kleinen Krieg auslösen wollte, aber ich bin grad etwas angeschwipst, von daher lässt mich das kalt
-
Decimad schrieb:
Ich denke, dass der TE auch eher wieder einen kleinen Krieg auslösen wollte, aber ich bin grad etwas angeschwipst, von daher lässt mich das kalt


Es ist Montag Abend!?!Ich will gar nicht wissen, wie du Freitags drauf bist..
