NULL
-
+fricky schrieb:
noch irgendwas? pointer und mehrfachvererbung vielleicht?
Java hat doch Pointer, nur keine Pointerarithmetik. Oder lässt du dich von Sun's Naming-Convention irre leiten, welche diese Pointer als References bezeichnet?
Kein Wunder C kennt keine strenge Typisierung.
C++ aber auch nicht, hat's alles von C übernommen, bis auf die kleine ausnahme mit dem void*
:)[/quote]
Haha, der war gut
-
Java-Progger schrieb:
+fricky schrieb:
noch irgendwas? pointer und mehrfachvererbung vielleicht?
Java hat doch Pointer, nur keine Pointerarithmetik. Oder lässt du dich von Sun's Naming-Convention irre leiten, welche diese Pointer als References bezeichnet?
es ist verdammt lange her, als ich mit Java zu tun hatte, also vielleicht hat sich das geändert. Aber soweit ich mich erinnere, sind diese ach-so-tolle Referenzen eher mit C++ Referenzen zu vergleichen als mit C Zeigern. Oder kannst du eine Java Referenz auf jede beliebige Addresse des Addressraums zeigen lassen?
-
supertux schrieb:
es ist verdammt lange her, als ich mit Java zu tun hatte, also vielleicht hat sich das geändert. Aber soweit ich mich erinnere, sind diese ach-so-tolle Referenzen eher mit C++ Referenzen zu vergleichen als mit C Zeigern. Oder kannst du eine Java Referenz auf jede beliebige Addresse des Addressraums zeigen lassen?
kannst du Referenzen einfach mal auf andere Objekte zeigen lassen?
ja, ist schon ein echter schwachpunkt, dass diese starke source code encryption technologie allen java codern verwehrt ist. dann könnte java eindlich so'nen stream-input shiftoperator einführen, wie z.b. C++'s <<, der seine operanden nach belieben verwurschteln kann.
Vektor a,b; Matrix m; m.multiply(a.plus(b))
vs
m*(a+b)
-
otze schrieb:
Vektor a,b; Matrix m; m.multiply(a.plus(b))
vs
m*(a+b)
Genau das habe ich mit der Aussage gemein.
Wieso ist es ein Fehler keine op. overloading zu haben? Nun wird zwar deine nachste mathematische API eben ein wenig komplizierter zu benutzen sein, ich kann aber gut ohne op. overloading leben.
Gibt es irgendein Beispiel in dem op. Uberladung sinnvoll ist, dass nicht irgendwelche Vektoren oder Matritzen beinhaltet (oder selbst definierten komplexe Zahlen). Also ein Beispiel ausserhalb der Mathematik?
-
DEvent schrieb:
Gibt es irgendein Beispiel in dem op. Uberladung sinnvoll ist, dass nicht irgendwelche Vektoren oder Matritzen beinhaltet (oder selbst definierten komplexe Zahlen). Also ein Beispiel ausserhalb der Mathematik?
Das muss man sich auf der Zunge zergehen lassen
-
operator overloading ist öfters mal im Dienste der Lesbarkeit sinnvoll, z.B. "+" für Arithmetik, Listen & Strings oder * für die Vervielfachung von Objekten wie Strings, außerdem haben viele Sprachen ohne explizites operator overloading Elemente von implizitem operator-overloading an versteckten Stellen, z.B. ( ) für Auswertungs-Priorität & Argumentübergabe bei Funktionen, - für Subtraktion (binär) und Negation (unär).
-
Und noch was sollte man da ergänzen:
Wenn eine Programmiersprache alles verbieten müsste, was man falsch verwenden könnte, dann dürfte es gar keine Programmiersprachen mehr geben.Grüssli
-
u_ser-l schrieb:
operator overloading ist öfters mal im Dienste der Lesbarkeit sinnvoll, z.B. "+" für Arithmetik, Listen & Strings oder * für die Vervielfachung von Objekten wie Strings, außerdem haben viele Sprachen ohne explizites operator overloading Elemente von implizitem operator-overloading an versteckten Stellen, z.B. ( ) für Auswertungs-Priorität & Argumentübergabe bei Funktionen, - für Subtraktion (binär) und Negation (unär).
Ich habe um ein Beispiel gebeten. Implizierte op-overloading nenne ich Sprach-Feature weil es in der Sprache eingebaut ist.
myArray += elememt; myArray.add(element); str = new StringBuilder(); str += "Hallo"; str.append("Hallo"); stream << "Text"; stream.write("Text"); listeners += new EventListener(); listeners.add(new EventListener());
Also wo ist bitte op.-overloading ausserhalb von mathematischen Bibliotheken. sinnvoll?
-
otze schrieb:
supertux schrieb:
es ist verdammt lange her, als ich mit Java zu tun hatte, also vielleicht hat sich das geändert. Aber soweit ich mich erinnere, sind diese ach-so-tolle Referenzen eher mit C++ Referenzen zu vergleichen als mit C Zeigern. Oder kannst du eine Java Referenz auf jede beliebige Addresse des Addressraums zeigen lassen?
kannst du Referenzen einfach mal auf andere Objekte zeigen lassen?
meinst C++ Refrenzen? Soweit ich weiß nicht. Deswegen sagte ich, dass für mich Java Referenzen eher wie C++ Referenzen sind und nicht wie C Zeiger.
-
supertux schrieb:
otze schrieb:
supertux schrieb:
es ist verdammt lange her, als ich mit Java zu tun hatte, also vielleicht hat sich das geändert. Aber soweit ich mich erinnere, sind diese ach-so-tolle Referenzen eher mit C++ Referenzen zu vergleichen als mit C Zeigern. Oder kannst du eine Java Referenz auf jede beliebige Addresse des Addressraums zeigen lassen?
kannst du Referenzen einfach mal auf andere Objekte zeigen lassen?
meinst C++ Refrenzen? Soweit ich weiß nicht. Deswegen sagte ich, dass für mich Java Referenzen eher wie C++ Referenzen sind und nicht wie C Zeiger.
aua.
-
Java-Progger schrieb:
+fricky schrieb:
noch irgendwas? pointer und mehrfachvererbung vielleicht?
Java hat doch Pointer, nur keine Pointerarithmetik. Oder lässt du dich von Sun's Naming-Convention irre leiten, welche diese Pointer als References bezeichnet?
nee, aber du akzeptiert wohl nur sowas wie c++ referenzen als 'richtige' referenzen. c++ ist nicht der masstab dafür, was andere programmiersprachen als referenz bezeichnen dürfen. 'nen unterschied zwischen 'referenz' und 'pointer' gibt es doch nur unter C++ und C#, oder? andere sprachen haben entweder das eine oder das andere, und nenen es pointer, referenz oder sonstwie.
mit Java-referenzen kannst du weder rechnen, noch kannste 'ne referenz auf was fremdes verweisen lassen (z.b. ein byte[] auf ein double[]). aber selbst ohne diese einschränkungen, ist es keiner sprache verboten, irgendeine form des 'verweisens auf objekte' referenz zu nennen. dass java intern pointer verwendet (macht C++ bei seinen 'referenzen' übrigens auch sehr oft), spielt doch keine geige. ein dämlicher programmierer wird ausgebremst, groben unfug damit anzustellen. das ist wichtiger.
-
Also wo ist bitte op.-overloading ausserhalb von mathematischen Bibliotheken. sinnvoll?
Container, Smartpointer, Inline-EBNF(boost::spirit)
Dass man es nicht allzu oft braucht ist der Grund, warum es in Java nicht vorhanden ist, das Problem ist allerdings, dass man in C++ drauf verzichten kann, wenn man will, es sich in Java aber nicht einfach herbei zaubern kann.nee, aber du akzeptiert wohl nur sowas wie c++ referenzen als 'richtige' referenzen. c++ ist nicht der masstab dafür, was andere programmiersprachen als referenz bezeichnen dürfen. 'nen unterschied zwischen 'referenz' und 'pointer' gibt es doch nur unter C++ und C#, oder? andere sprachen haben entweder das eine oder das andere, und nenen es pointer, referenz oder sonstwie.
Hier geht es darum, ob eine Java-Referenz eher einem Pointer oder einer C++-Referenz ähnelt. Auf jedenfall liegt sie dazwischen, aber im Prinzip ist es ein Pointer, mit dem man weniger machen kann. Nomenklatur ist doch irrelevant.
-
Bei der Diskussion das Schlüsselwort final nicht vergessen!
-
JustAnotherNoob schrieb:
Also wo ist bitte op.-overloading ausserhalb von mathematischen Bibliotheken. sinnvoll?
Container, Smartpointer, Inline-EBNF(boost::spirit)
z.b. die Java collections, ArrayList<blah> usw. kommen bestens ohne op-overloading zurecht und 'smartpointer' sind 'ne c++ spezialität, die unter java total überflüssig ist.
JustAnotherNoob schrieb:
Dass man es nicht allzu oft braucht ist der Grund, warum es in Java nicht vorhanden ist
nee, der grund ist eigentlich, dass der nutzen überladener operatoren gering, aber die gefahr chaotischen code zu produzieren, recht hoch ist.
JustAnotherNoob schrieb:
das Problem ist allerdings, dass man in C++ drauf verzichten kann, wenn man will, es sich in Java aber nicht einfach herbei zaubern kann.
in c++ musste doch oft den << überladen, um klassen z.b. 'cout'-compatibel zu machen. und auch sonst spielt die richtige überladung bestimmter operatoren beim c++klassendesign eine wichtige rolle. von verzichten kann man nun wirklich nicht reden.
Hier geht es darum, ob eine Java-Referenz eher einem Pointer oder einer C++-Referenz ähnelt. Auf jedenfall liegt sie dazwischen, aber im Prinzip ist es ein Pointer, mit dem man weniger machen kann.
ist richtig, aber viele scheinen zu glauben, dass alles was sich anders verhält, als eine C++ referenz, den namen 'referenz' nicht verdient.
-
z.b. die Java collections, ArrayList<blah> usw. kommen bestens ohne op-overloading zurecht und 'smartpointer' sind 'ne c++ spezialität, die unter java total überflüssig ist.
Man kommt immer ohne Sprachfeatures zurecht. Das ist nur eine Ausrede. Den Indexoperator nutzen zu können ist syntaktischer Zucker, man braucht es natürlich nicht, aber es ist schöner. Smartpointer sind nicht unbedingt etwas, was man nur in C++ gebrauchen kann. Ich hatte z.B. mal eine Klasse implementiert, die wie ein Pointer zu handhaben ist, sich aber aus einem Funktor konstruiert und den eigentlichen Inhalt damit erst läd, wenn dieser benötigt wird(sprich annähernd das was unter Haskell lazy evaluation bewerkstelligt). Sowas könnte man auch unter Java gebrauchen. (Ist zwar nicht direkt ein Smartpointer, aber es syntaktisch einem Pointer ähnlich zu machen, war in dem Fall zwar sogar notwendig(Template), aber ist auch sinnvoll)
Joa, Spezialfälle wie Inline-EBNF und Inline-RegExp bleiben.nee, der grund ist eigentlich, dass der nutzen überladener operatoren gering, aber die gefahr chaotischen code zu produzieren, recht hoch ist
Ich hab nie behauptet, dass C++ eine Anfängersprache ist, aber ich bezweifle, dass jemand, der Bescheid weiß mal aus Versehen Operatorenüberladung verwendet.
in c++ musste doch oft den << überladen, um klassen z.b. 'cout'-compatibel zu machen.
In Java würde man eine toString Methode implementieren, ist zwar hässlich, in C++ aber auch machbar.
und auch sonst spielt die richtige überladung bestimmter operatoren beim c++klassendesign eine wichtige rolle. von verzichten kann man nun wirklich nicht reden.
Sonst fällt mir keine ein..
-
volkard schrieb:
aua.
wie ich schon sagte, es ist super lange her, als ich mit Java zu tun hatte, und das auch noch eher oberflächlich. Das war für mich damals mein Fazit. Wenn es nicht stimmt, darfst du auch anstatt nur "aua" zu schreiben, mir erklären, was falsch an meiner Aussage ist.
-
supertux schrieb:
volkard schrieb:
aua.
wie ich schon sagte, es ist super lange her, als ich mit Java zu tun hatte, und das auch noch eher oberflächlich. Das war für mich damals mein Fazit. Wenn es nicht stimmt, darfst du auch anstatt nur "aua" zu schreiben, mir erklären, was falsch an meiner Aussage ist.
zur frage stand, ob java-referenzen eher wie c++-referenzen oder wie c++-zeiger sind. das argument war, daß man c++-referenzen nicht umbiegen kann, c++-zeiger aber sehr wohl. das ist der hauptunterschied. das meinte "kannst du Referenzen einfach mal auf andere Objekte zeigen lassen?".
darauf war deine antwort "meinst C++ Refrenzen? Soweit ich weiß nicht. Deswegen sagte ich, dass für mich Java Referenzen eher wie C++ Referenzen sind und nicht wie C Zeiger."
genau deswegen solltest du sagen, daß java-referenzen eher wie c++-zeiger sind, weil wie du selber bestätigt hast, c++-referenzen sich nicht umbiegen lassen.
-
also habe ich anscheinend nichts falsches erzählt (oder bin zu blöd, deine Erklärung zu verstehen). Wozu habe ich denn das 'aua' bekommen?
-
meinst C++ Refrenzen? Soweit ich weiß nicht. Deswegen sagte ich, dass für mich Java Referenzen eher wie C++ Referenzen sind und nicht wie C Zeiger.
=> Bei Java Referenzen kannst du das aber.
-
JustAnotherNoob schrieb:
Ich hatte z.B. mal eine Klasse implementiert, die wie ein Pointer zu handhaben ist, sich aber aus einem Funktor konstruiert und den eigentlichen Inhalt damit erst läd, wenn dieser benötigt wird(sprich annähernd das was unter Haskell lazy evaluation bewerkstelligt). Sowas könnte man auch unter Java gebrauchen.
im prinzip steuert das ein flag, dass vor dem ersten zugriff false ist, die daten beim ersten zugriff lädt und dann auf true gesetzt wird, stimmts? wieso hast du die klasse denn als pointer getarnt, wenn sie doch keiner ist? und dass sie sich in jedem fall wie ein echter pointer verhält, will ich mal bezweifeln. das bekommste wahrscheinlich trotz aller operatorenüberladungen nicht hin.
JustAnotherNoob schrieb:
Joa, Spezialfälle wie Inline-EBNF und Inline-RegExp bleiben.
was meinst du mit 'inline'? dinge die der compiler selbst auswertet, ohne code zu erzeugen, der zur laufzeit (z.b. die RegExp) ausgeführt wird? wenn ja: stimmt, sowas kann java nicht (empfinde ich übrigens nicht als nachteil). java hat noch nicht mal sowas ähnliches wie den C-präprozessor. wer code-manipulierende features o.ä. braucht, ist auf zusatztools wie externe codegeneratoren usw. angewiesen.
...aber ich bezweifle, dass jemand, der Bescheid weiß mal aus Versehen Operatorenüberladung verwendet.
nicht aus versehen, für den verfasser verständlich und einleuchtend, für andere leser (und verwender) des codes möglicherweise schwer durchschaubar und mit seltsamen nebeneffekten verbunden. z.b. haste das problem bei 'nem überladenen operator, wer das resultat wieder freigeben soll, wenn's nicht mehr gebraucht wird. oder was passiert, wenn die operation schiefgeht usw. d.h. du musst dir viele gedanken machen, wenn du op-overloading sinnvoll einsetzen willst, damit der benutzer es intuitiv verwenden kann, ohne in irgendwelche fallen zu tapsen. der aufwand steht nicht im verhältnis zum nutzen (es sei denn, man hat spass an sowas).