Initialisierung und Variablen Deklaration



  • @xe-li Ah, so ergibt das für mich nun auch wirklich Sinn.....



  • @STOERSENDER sagte in Initialisierung und Variablen Deklaration:

    Wieso der Autor nicht einfach dann int, oder double o.ä einsetzt.

    Vermutlich weil er zeigen wollte dass es nicht nur für int oder double geht, sondern für beliebige Typen - vorausgesetzt sie haben einen Copy-Konstruktor...
    ...und ihm nicht klar war dass er damit Anfänger verwirren wird die noch nicht wissen dass T sehr oft mit der Bedeutung "ein beliebiger Typ" verwendet wird.
    (Bzw. halt "ein beliebiger Typ der bestimmte Voraussetzungen erfüllt" - wie in diesem Beispiel die Voraussetzung dass er kopierbar ist.)



  • ps:

    @xe-li sagte in Initialisierung und Variablen Deklaration:

    Generics sind eine schöne Sache, dar das Programm zur Laufzeit den Typ selbst bestimmen kann.

    Erstmal gibt es in C++ keine "Generics". Es gibt Templates, die werden auch gerne mal als Generic Types bezeichnet, aber den Begriff "Generics" kenne ich nur von C#.

    Und: zur Laufzeit passiert da gar nix. C++ ist vollständig statisch typisiert, der Typ jeder Variable wird bei der Übersetzung festgenagelt. Was bei Templates passiert ist lediglich dass man Code schreiben kann der Placeholder für Typen wie T verwendet, und diesen Code kann man dann mit unterschiedlichen Typen verwenden. Man muss es aber irgendwo festnageln. Der Compiler baut dann anhand der Schablone (=das Template) neuen Code, wo er halt die Platzhalter (T) durch die konkreten Typen ersetzt. Funktionen oder allgemein Ausdrücke die mal nen int und mal nen double zurückgeben/ergeben sind in C++ nicht möglich.



  • @hustbaer sagte in Initialisierung und Variablen Deklaration:

    Und: zur Laufzeit passiert da gar nix. C++ ist vollständig statisch typisiert, der Typ jeder Variable wird bei der Übersetzung festgenagelt.

    C++ ist nicht statisch typisiert, da man zur Laufzeit polymorphen Variablen neue Typen zuweisen kann. Wenn man nachladbare Module verwendet (geht nur über systemspezifische Erweiterungen) dann kann man sogar Typen verwenden, die zum Übersetzungszeitpunkt des Hauptprogramms gar nicht existierten. Allerdings ist das Dispatching statisch, da die Aufrufkonventionen beim Übersetzen des Hauptprogramms festgelegt wurden. D.h. man kann nur abgeleiteten Typen verwenden. Das Duck Typing anderer Sprachen bzw. der Templates funktioniert in C++ zur Laufzeit nicht.



  • @john-0 sagte in Initialisierung und Variablen Deklaration:

    C++ ist nicht statisch typisiert, da man zur Laufzeit polymorphen Variablen neue Typen zuweisen kann.

    Ja nee.



  • @Swordfish sagte in Initialisierung und Variablen Deklaration:

    Ja nee.

    Und der dynamic_cast ist eine bloße Einbildung?



  • struct foobar {};
    struct foo : foobar {};
    struct bar : foobar {};
    
    // ...
    
    foobar *f = new foobar;
    f = new foo;
    f = new bar;
    

    Welchen Typ hat f?



  • f ist vom typ zeiger auf foobar und daher sollte man über f nicht auf die (zusätzlichen) methoden der klassen foo und bar zugreifen können?

    der sinn von templates besteht soweit ich weiß darin, dass man eine funktion für alle datentypen hat. soll die funktion also z.b. noch "hello world!" ausgeben, so müsste man bei der verwendung von templates genau eine funktion ändern. hat man dagegen jeweils eine funktion für unsigned char, char, unsigned short int, short int, unsigned int, int, unsigned long int, long int, unsigned long long int, long long int, float, double, long double und jede erdenkliche datenstruktur, klasse usw. so wäre eine so kleine änderung verdammt aufwändig, und aus genau dem grund hat man templates eingeführt.😀



  • @Wade1234 sagte in Initialisierung und Variablen Deklaration:

    f ist vom typ zeiger auf foobar

    Ah. Ok. Danke.



  • Das letzte mal, als ich nachgesehen habe, musste man auch dem dynamic cast sagen, was für ein Typ hinten bei rauskommt.
    Auch wenn der dynamic_cast auf RTTI basiert, ist C++ eine typische statisch typisierte Sprache. Und zwar eine "manifested typed language" (ich komm grade nicht auf den deutschen Begriff).



  • @Schlangenmensch sagte in Initialisierung und Variablen Deklaration:

    ist C++ eine typische statisch typisierte Sprache.

    Danke, ich dachte immer C++ hätte ein dynamisches Typsystem.



  • @Schlangenmensch Ja, ich denke dass C++ statisch typisiert ist ist so ziemlich fast allen klar. Es gibt aber ein paar olle Störsender die hin und wieder nicht anders können als Dinge mit Gewalt miszuverstehen damit sie dagegenreden können. Vielleicht damit sie sich in dem Bewusstsein sonnen können wieder mal Recht gehabt zu haben. Vielleicht ist es auch was persönliches und sie suchen nur bei Benutzern die sie nicht mögen nach Dingen die man irgendwie so hinbiegen könnte dass sie falsch erscheinen. Vielleicht läuft das auch ganz unbewusst. Mir im Prinzip Wurst, denn gottseidank muss ich diese Ergüsse nicht mehr lesen (ausser sie werden von jmd. anderem zitiert wie in diesem Fall).

    Wenn etwas vage oder misverständlich formuliert ist hab ich ja nichts dagegen wenn man darauf hinweist/es verbessert bzw. korrigiert. War aber hier nicht der Fall.



  • @hustbaer sagte in Initialisierung und Variablen Deklaration:

    @Schlangenmensch Ja, ich denke dass C++ statisch typisiert ist ist so ziemlich fast allen klar.

    Die Sache ist ganz einfach, eine statische Typisierung liegt vor, wenn die Typprüfung zum Übersetzungszeitpunkt erfolgt. Simple Frage: Wann wird der Typ in einem dynamic_cast überprüft – beim Übersetzen des Programms oder während der Laufzeit?

    Im Embedded Bereich wird genau aus diesem Grund oftmals C++ ohne RTTI genutzt, diese Untermenge ist dann statisch typisiert. Was ist daran so schwer zu verstehen? Historisch hast Du Recht, aber wir reden da über sehr altes C++ ohne RTTI. Nur irgend wie hält sich so vieles in den Köpfen was schon lange nicht mehr zutreffend ist.



  • @Swordfish sagte in Initialisierung und Variablen Deklaration:

    Welchen Typ hat f?

    Die entscheidende Frage ist nicht welcher Typ hat f, sondern welcher Typ hat *f.



  • @john-0 Du kannst natürlich die Eigenschaft "statically typed" solange verdrehen bis sie in Dein Konzept passt. Just go on. Heck, mit Deiner Herangehensweise ist nichtmal C statically typed.

    Darfst mit Herb weiterstreiten:

    [...] it has static typing but not necessarily "strong" typing.



  • @Swordfish sagte in Initialisierung und Variablen Deklaration:

    @john-0 Du kannst natürlich die Eigenschaft "statically typed" solange verdrehen bis sie in Dein Konzept passt.

    Es ist eine anerkannte Definition in der Informatik. Nur bei einigen Größen der C++ Programmierung will man davon nichts wissen. Fakt ist, bei C++ werden Typprüfungen zur Laufzeit vorgenommen, und zwar immer dann, wenn der dynamic_cast genutzt wird. Wenn Du diese Definition unzutreffend findest, welche Definition benutzt Du? Wie beschreibst Du statische Typisierung und wie verträgt sich damit dynamic_cast?

    Just go on. Heck, mit Deiner Herangehensweise ist nichtmal C statically typed.

    C hat keinerlei Sprachelemente, die es zur Laufzeit erlauben würden eine Typprüfung vorzunehmen. Deshalb C ist komplett statisch typisiert. Allerdings werden in diversen Projekten OOP und somit dynamische Typprüfung in C nach programmiert. Nur wie gesagt, ohne jede Unterstützung durch die Programmiersprache selbst.



  • @john-0 sagte in Initialisierung und Variablen Deklaration:

    Wenn Du diese Definition unzutreffend findest, welche Definition benutzt Du? Wie beschreibst Du statische Typisierung und wie verträgt sich damit dynamic_cast?

    T foo;
    

    foo ist vom Typ T. Und foo wird auch immer vom Typ T bleiben.



  • @Swordfish sagte in Initialisierung und Variablen Deklaration:

    foo ist vom Typ T. Und foo wird auch immer vom Typ T bleiben.

    Damit hast Du gerade CLOS zu einer statisch typisierten Sprache gemacht.

    Nachtrag: Du würdest somit nur Sprachen als dynamisch typisiert klassifizieren, die es erlauben zur Laufzeit bestehende Typen zu verändern z.B. JavaScript. Für das klassische Paradigma der dynamisch typisierten Programmiersprachen SmallTalk trifft das nämlich nicht zu. Ok, Du kannst natürlich darüber argumentieren, dass man in die Variable foo andere Objekte speichern kann, aber exakt das gleiche ist in C++ für Basiszeiger gegeben.



  • @john-0 sagte in Initialisierung und Variablen Deklaration:

    Damit hast Du gerade CLOS zu einer statisch typisierten Sprache gemacht.

    Ich habe garnicht gewusst daß das gültiges Lisp ist.



  • ist es bei templates nicht die aufgabe des compilers, irgendwie zu ermitteln, welcher datentyp da jetzt verwendet wird? das ändert doch nichts daran, dass der assembler dann mov rax, addw etc. übergeben bekommt und der datentyp feststeht, oder doch?
    also "der datentyp" ist ja sowieso schon mal etwas, das nachher im programm nicht mehr existiert.🙄


Anmelden zum Antworten