Wie lange wird es noch C++ geben?
-
Hat C# wirklich keine Zeiger (außer unsafe)? Die gibts ja sogar in Java, wenn auch nicht mit Pointerarithmetik.
-
kurze zwischenfrage schrieb:
Hat C# wirklich keine Zeiger (außer unsafe)? Die gibts ja sogar in Java, wenn auch nicht mit Pointerarithmetik.
Referenzen in C# haben exakt die gleiche Semantik wie in Java, falls Du das meinst. Darüberhinaus kenne ich in Java keine Zeigerkonzepte (ich kenne Java aber auch nicht besonders gut).
-
LordJaxom schrieb:
kurze zwischenfrage schrieb:
Hat C# wirklich keine Zeiger (außer unsafe)? Die gibts ja sogar in Java, wenn auch nicht mit Pointerarithmetik.
Referenzen in C# haben exakt die gleiche Semantik wie in Java, falls Du das meinst. Darüberhinaus kenne ich in Java keine Zeigerkonzepte (ich kenne Java aber auch nicht besonders gut).
Kann man die Referenzen in C# auf null setzen? In Java kann ich einfach sowas machen.
Object o = null;Darum würde ich von Zeigern sprechen, auch wenn es oft als Referenz bezeichnet wird.
In C++ kann eine Referenz ja nicht NULL sein.
-
Die Referenzen in C# und Java sind relativ identisch, in C# kannst du sie auch auf null setzen. Trotzdem ist das keine Art von Zeigern wie bei C++, du hast zwar Referenzen/Zeiger auf Objekte, dafür hast du keine Zeiger auf einzelne chars o.ä.
Und afaik kann man in Java keine Swap-Methode schreiben:
void swap( int& a, int& b ) { int tmp = a; a = b; b = tmp; } int a, b; swap( a, b );vs
huch, geht nicht?? Höchstens so: void swap( int[] arr, int i1, int i2 ) { int tmp = arr[i1]; arr[i2] = tmp; arr[i1] = tmp; } int[] bla = { 10, 20 }; swap( bla, 0, 1 );Deshalb halt "es gibt keine Zeiger in Java". Man kann in Java und C# halt nur by-value übergeben und nie by-reference - man sich aber drüber streiten, ob ein Referenz-Parameter ein call-by-reference (weil eine Referenz auf ein Objekt übergeben wurde) oder aber ein call-by-value (weil ja nur der Wert des Zeigers übergeben wurde) verwendet wird. Wurden aber glaubich schon seitenlange Diskussionen drüber geführt

-
Badestrand schrieb:
Man kann in Java und C# halt nur by-value übergeben und nie by-reference
In C# kann man

void swap<T>(ref T a, ref T b) { T temp = a; a = b; b = temp; } T a; T b; swap(ref a, ref b);
-
Oh stimmt, hab so lang nix mehr mit C# gemacht
Dann nehme ich hiermit die Hälfte von meinem Beitrag zurück..
-
Das du in Java kein Swap machen kannst, liegt halt daran, dass es keine Zeiger/Referenzen auf primitive Typen gibt und kein call by reference. In C# gibt es anscheinend ein richtiges call by reference.
Keine Ahnung ob es irgendwo eine Definition gibt wann man es Zeiger oder Referenz nennt. Was ist dafür ausschlaggebend? Kann auf null zeigen? Pointerarithmetik möglich? ...
-
Badestrand schrieb:
...Trotzdem ist das keine Art von Zeigern wie bei C++, du hast zwar Referenzen/Zeiger auf Objekte, dafür hast du keine Zeiger auf einzelne chars o.ä....
Dass Java die Einschränkung hat, dass man primitive Typen nicht referenzieren kann, bedeutet doch nicht, dass ihre "Objektreferenzen" keine Zeiger sind...
Der einzige Unterschied zwischen Javareferenzen und C++-Zeigern ist:
Java verbietet:
- Referenzierung primitiver Typen (inkl. Referenzen),
- "Zeigerarithmetik" und
- "Objektübergabe per Referenz" "call-by-reference" zu nennen. ( :p
)Der ganze Rest (Verweischarakter, "Umbiegbar", Nullable, cast, Typcharakter, ....) ist doch vollkommen identisch.
BTW: Natürlich geht swap() in Java - nur natürlich nicht mit Referenzen auf primitive Typen, weil Java da eine willkürliche Grenze gezogen hat.
Gruß,
Simon2.
-
Ja, Java und C# haben die Fähigkeiten von Zeigern etwas eingeschränkt (um mögliche Fehlerquellen auszuschließen), diese abgespeckten Zeiger in "Referenzen" umgetauft - und behaupten seitdem, keine Zeiger zu verwenden

(und jetzt gibt es regelmäßig Verständnisprobleme, weil irgendwer C++ Referenzen und Java Referenzen miteinander verwechselt)
-
Simon2 schrieb:
Der ganze Rest (Verweischarakter, "Umbiegbar", Nullable, cast, Typcharakter, ....) ist doch vollkommen identisch.
Da Java-Referenzen bei Übergabe aber kopiert werden, kann das "Umbiegen" einer Referenz keine Seiteneffekte haben.
-
byto schrieb:
Simon2 schrieb:
Der ganze Rest (Verweischarakter, "Umbiegbar", Nullable, cast, Typcharakter, ....) ist doch vollkommen identisch.
Da Java-Referenzen bei Übergabe aber kopiert werden, kann das "Umbiegen" einer Referenz keine Seiteneffekte haben.
Pointer werden in C/C++ genauso kopiert, also hat das (lokale) Umbiegen ebenfalls keine Seiteneffekte.
-
byto schrieb:
...Da Java-Referenzen bei Übergabe aber kopiert werden, kann das "Umbiegen" einer Referenz keine Seiteneffekte haben.
1.) siehe CStoll
2.) Ich verstehe jetzt gerade nicht, welches Szenario Dir vorschwebt. Zwischen "Umbiegen", "Kopieren" und "Seiteneffekt" bekomme ich jedenfalls gerade keine Verbindung.Ich meine mit "Umbiegen":
A* pa = new A("Obj1"); // zeig' mal hierhin .... pa->do_something(); pa = new A("Obj2"); // ... zeig' mal dorthin pa->do_something();(die "deletes" habe ich der Übersichtlichkeit halber weggelassen)
bzw.A pa = new A("Obj1"); // zeig' mal hierhin .... pa.do_something(); pa = new A("Obj2"); // ... zeig' mal dorthin pa.do_something();in beiden Fällen verweist pa erst auf das "Obj1"- und dann auf das "Obj2"-Objekt...
Gruß,
Simon2.
-
hey, wer kommt eigentlich dauernd auf den schwachsinnigen und idiotischen gedanken, dass C+ nur das gerings mit C# hätte? C# ist nur ein billiger Java abklatsch, welcher von MS gehyped wird. Und das C im namen hat auch nur was mit marketing zu tun. C# ist dreck den kein mensch braucht. Wenn ich plattformabhängigen frickelcode haben will, dann prog ich asm.
-
c#, java ist wie ein auto mit automatik schaltung, ABS, ESP etc. fehlst nur noch Autopilot und man muss gar nichts mehr selber machen;)
Wo bleibt da der spass

-
Simon2 schrieb:
BTW: Natürlich geht swap() in Java - nur natürlich nicht mit Referenzen auf primitive Typen, weil Java da eine willkürliche Grenze gezogen hat.
Na dann mach mal ein Beispiel. Ich sage es geht nicht, weil es auch keine Zeiger auf Zeiger (primitiver Typ) gibt. Den Inhalt aller Member kopieren ist kein swap.
-
kurze zwischenfrage schrieb:
Simon2 schrieb:
BTW: Natürlich geht swap() in Java - nur natürlich nicht mit Referenzen auf primitive Typen, weil Java da eine willkürliche Grenze gezogen hat.
Na dann mach mal ein Beispiel. Ich sage es geht nicht, weil es auch keine Zeiger auf Zeiger (primitiver Typ) gibt. ...
Hast Recht !
Gruß,
Simon2.
-
swdfsdfsdf schrieb:
C# ist dreck den kein mensch braucht.
Genau wie inkompetente Postings wie dieses.

c#, java ist wie ein auto mit automatik schaltung, ABS, ESP etc.
Also mir ist ein Automatik Porsche lieber als ein Opel mit manuellem Getriebe.

-
Kurze Antwort: Ja, lohnt sich durchaus, auch wenn du später (solltest du beurflich in die Richtung einsteigen) evtl. kein C++ programmieren wirst.
Es geht bei sowas doch v.a. um die Konzepte und Hintergründe, und deswegen lohnt sich das schon. Und letztlich ist der Unterschied zwischen C++, Java, C# usw. doch gar nicht so groß. Ob du nun z.B. automatische Speicherverwaltung hast oder dich selbst drum kümmern musst (was ja immer als erstes bei so Diskussionen kommt) ist eigentlich gar nicht mal so wichtig, wenn man mal von Anfängern absieht. Letztlich gehts dabei nur um Resourcenfreigabe, und sowas wirst du immer wieder haben, dass du Resourcen freigeben musst, auch in Java/C# (z.B. Datenbank-Objekte, ...).
Wirklich interessant ist da eher der Vergleich mit Sprachen, die ganz andere Konzepte verfolgen, z.B. Prolog.
-
In Java muß ich auch Resourcen freigeben... die betreffen zwar keinen nativen Speicherbereich, aber trotzdem indirekt Speicher.
Habe ich eine File-Objekt geöffnet, muß ich auch in Java zu dieser Resource "close" sagen. Sonst bleibt diese Resource so lange "besetzt", bis die Java-Virtual Maschine beendet wird. Und das kommt in der Analogie einem runter fahren eines Rechners.
Wenn ich in Java diese Resource nicht close, obwohl ich es nicht brauche, habe ich auch ein "Leck".
Aber jetzt wird man mich eh wieder Troll nennen.

-
Hehe, ja genau das meine ich auch

Wenn man wirklich *richtige* Projekte hat, und nicht so Firlefanz 100-Zeilen-Demo Projekte, dann muss man auch in Java&Co genauso Resourcen freigeben.
Aber soll jetzt auch nichts gegen Java sein, programmiere ja selbst gerne auch in Java. Nur sollte man endlich mal von dem Gedanken wegkommen, dass nur C++-Programme fricklig sind. Das hängt immer vom Programmierer ab, und wenn jemand nicht wirklich programmieren kann, dann wird er auch fricklige Java-Programme schreiben