Viele Fragen von einem unerfahrenem Nutzer.



  • 1. Bedeutet, das der Compiler keinen Funktionsaufruf durchführt, sondern das, was die Funktion tut, direkt vor Ort "einsetzt"/"einfügt".
    2. int* x = 5 ist ein Zeiger auf einen Int. Dieser Zeiger zeig auf die Speicheradresse 5. int x = 5; ist hingegen ein Integer. (Dessen Adresse kriegt man mit &x)
    3. int* x = 5 ist meist Unsinn, Du weißst doch garnicht, was an Adresse 5 liegt. Diese festen Werte braucht man eigentlch nur bei Betriebsystemprogrammierung. Wenn Du einen Integer möchtest, dann schreib int x = 5, wenn Du einen Pointer willst, int* x;, aber initialisier den dann nicht mit festen Werten. Ein Pointer ist eben kein integer, sondern er zeigt auf einen solchen, er zeigt, wo man einen finden kann. Das heißt auch, Du hast keinen Speicher für einen Integer bekommen, wenn Du nur int* x; schreibst. (Wobei ein Pointer die Größe eines 32-bit Integers hat, deutlicher würde das Problem, wenn man einen anderen Typen nehmen würde.)
    Wenn Du die Variable bekommen willst, auf die ein Pointer zeigt, musst Du ihn dereferenzieren.

    int x = 7; // Integer
    int* y = &x; // Pointer, der auf x zeigt. Der genaue Wert interessiert den Nutzer meist nicht, sondern nur die Tatsache, das er auf ein bestimmtes Objekt zeigt
    *y = 10; // x wird 10, weil wir y dereferenziert haben
    

    4. ~Klassenname() ist das Gegenteil vom Konstruktor. EIne Funktion, die bei der Zerstörung einer Instanz der Klassen aufgerufen wird.
    5. Ein std::vector, den du möglicherweise meinst, ist ein Container aus der STL. Im Prinzip ein Array mit dynamischer Größe (und noch ein paar Funktionen mehr)

    EDIT: int* x = 5 geht übrigens ohne weiteres nicht. Ein Int kann nicht einfach in einen Pointer umgewandelt werden (da meist Unsinn. Lässt sich mit casten umgehen) int* x = 0; ist aber erlaubt, denn es signalisiert, das x auf kein Objekt zeigt. (Nullpointer)



  • Die Antworten von euch Beiden sind echt hilfreich.

    Wobei ich bei der Frage 4. hapere, was bedeutet bei einer Zerstörung einer Instanz?

    Ich bin grad im Urlaub und am Montag bin ich wieder zuhause, dort erwarten mich wieder meine C++-Bücher (und ein Video-Tutorial - 9 Stunden lang).



  • Du definierst dir ja immer klassen

    class MeineKlasse {
    
    };
    

    Die Klassen sind BAUPLÄNE für deine Objekte. Das mit dem du im Code hantierst sind alle Objekte die nach dem Bauplan einer Klasse gebaut wurden (bis auf die eingebauten typen wie int bool usw..).

    Wenn du nun also sowas schreibst wie

    MeineKlasse variablenname;
    

    Wird ein Konstruktor aufgerufen um dein Objekt zu erzeugen. Wird dieses Objekt nun wieder zerstört (in unserem Fall würde es beim Verlassen des Sichtbarkeitsbereiches wieder zerstört weil auf dem Stack) so wird der Destruktor aufgerufen um diese Instanz dr Klasse(das Objekt) wieder sauber abzubauen im Speicher (vllt bissle blöde ausgedrückt :D)

    Viel Spaß beim weiteren Lernen



  • Understood schrieb:

    Ich bin grad im Urlaub und am Montag bin ich wieder zuhause, dort erwarten mich wieder meine C++-Bücher (und ein Video-Tutorial - 9 Stunden lang).

    Ich würde die Ferien geniessen und dir dann mit dem Buch Zeit nehmen. Das sind nämlich alles Fragen, die behandelt werden, wenn du ein anständiges Buch hast. 😉



  • Understood schrieb:

    Ich bin ein sehr wissbegieriger Nutzer und immer bereit etwas neues zu lernen, aber manchmal komme ich nicht mit. Da ich noch relativ jung, aber trotzdem fest entschlossen bin, an der Programmierung teilzuhaben, verstehe ich kaum die Fachbegriffe die die Bücher von sich geben, die ich bis jetzt besitze.

    Ich mag es, wenn man mir es gelassener erklärt. 😉

    Hallo Understood,

    willkommen im C++-Forum.

    Understood schrieb:

    1. inline <Rückgabetyp> <Funktionsname>(<Parameter>). Was bedeutet das inline?

    Mit 'inline' wird der Compiler aufgefordert, den Code innerhalb der Funktion an die Stelle zu setzen, an dem diese Funktion aufgerufen wird. Ohne inline würde der Code an eine andere Stelle übersetzt und das Programm würde dann von jeder Stelle aus, von der die Funktion aufgerufen wird, dort hin springen.

    Understood schrieb:

    2. Was ist der Unterschied, wenn ich "int* iX = 5;" und "int iX = 5" schreiben sollte?

    int* iX ist ein Pointer (ein Zeiger) auf eine int-Variable. Belegst Du sie mit '5', so heißt das, dass Du an der Adresse 5 ein int ansprechen kannst.
    Im Gegensatz dazu belegt int iX=5; eine int Variable mit dem Wert 5.

    Understood schrieb:

    3. Bezieht sich auf Frage 2.:
    Welche dieser beiden Möglichkeiten wären in welchem Fall ratsamer?

    Einen Pointer mit einem festen Wert zu belegen macht normalerweise (z.B. auf einem PC) keinen Sinn. Es kann bei der hardwarenahen Programmieren nötig sein, wenn Du Deine Hardware sehr genau kennst und einzelne Register ansprechen willst. Normal ist int iX=5;.

    Understood schrieb:

    4. Was bedeutet in einer Klasse das "~Funktionsname"?

    Beispiel zur Frage 4.:
    Funktions_Name();
    ~Funktions_Name();

    Ich unterstelle mal, Du meinst den Klassennamen. Dann ist ~Klassenname der Destruktor, der immer beim Zerstören des Objekts aufgerufen wird.

    Understood schrieb:

    5. Was bedeutet Vektor/Vector?

    Im C++-Standard wird ein vector<> definiert. Das ist ein Container, in dem Daten gleichen Typs sequentiell abgelegt werden können.

    Gruß
    Werner



  • @drakon:
    Abends ist mir immer langweilig und dann programmiere ich gerne etwas schönes.
    Momentan programmiere ich mit der von der C++-Sprache entwickelte Skriptsprache "AutoIt". Diese ist wesentlich einfacher, doch sie ist dementsprechend langsamer.
    AutoIt war ein guter Einstieg für mich, doch ich programmiere mit AutoIt schon über ein Jahr und es ist immer das Selbe.

    Langsam wird mir klar, dass C++ viel mehr Möglichkeiten hat, es ist zwar schwierig und es kann auch dauern zu lernen, aber Rom wurde schließlich auch nicht an einem Tag erbaut. 😉

    Deshalb versuche ich mich an ein paar mehr oder weniger kleinen Programmen damit ich, wenn ich aus dem Urlaub rauskomme, wieder mit voller Power rangehen kann.

    @Werner Salomon:
    Danke für Deinen Beitrag und ist auch gut erklärt.

    @All:
    Danke für eure Hilfe, ich werde diesen Thread weiterhin nutzen, sollten mehr Fragen auftreten, ich hoffe das Team von C-PP.de ist damit einverstanden. 🙂



  • Neue Fragen im ersten Post hinzugefügt:

    6. Was bedeutet folgende Zeile?

    (void**)Blubb
    

    7. Bezieht sich auf Frage 6.:
    Was bedeutet folgende Zeile?

    (void*)Blubb
    

    Vielen Dank für Antworten.

    Mit freundlichen Grüßen,
    Understood.


  • Mod

    Understood schrieb:

    Neue Fragen im ersten Post hinzugefügt:

    6. Was bedeutet folgende Zeile?

    (void**)Blubb
    

    7. Bezieht sich auf Frage 6.:
    Was bedeutet folgende Zeile?

    (void*)Blubb
    

    Vielen Dank für Antworten.

    Mit freundlichen Grüßen,
    Understood.

    Kommt ein bisschen auf den Zusammenhang an. Wenn das so mitten im Quellcode steht (also keine Deklaration von irgendwas), dann sind das Casts im alten C Stil. Und zwar wird Blubb beim ersten Fall in einen void** (zeiger uaf Zeiger auf void) gecasted, und im zweiten Fall zu void* (Zeiger auf void). Ein Cast bedeutet, dass das gecastete Objekt als ein anderer Datentyp aufgefasst wird, als es eigentlich ist. Leider ist bei den Casts im alten C-Stil nicht immer genau klar, was da technisch passiert. Das kann eine recht harmlose Umwandlung sein oder wildeste Reinterpretation des Inhalts von Blubb. Kommt auf den Typ von Blubb an.



  • In welchen Fällen würde das Casten von Variablen ratsam sein, und so wie Du es beschrieben hast, könnte ich auch

    (void)Blubb
    

    schreiben?


  • Mod

    Understood schrieb:

    In welchen Fällen würde das Casten von Variablen ratsam sein,

    Ein bisschen deutet ein Cast fast immer auf einen Fehler hin. Der häufigste legitime Cast ist, wenn man verhindern oder erzwingen will, dass eine bestimmte Überladung einer Funktion benutzt wird, obwohl der Typ eigentlich nicht passt, zum Beispiel einen Integer in einen Fließkommatyp casten, weil man im folgenden mit Fließkommazahlen weiterrechnen will, beziehungsweise umgekehrt.
    Es kommt auch manchmal im Zusammenhang mit Polymorphie vor, in C++ spricht man dann von einem dynamic_cast (brauche ich selber aber selten bis nie).
    Diese beiden Arten zu casten sind relativ harmlos.
    Dann gibt es noch zwei andere Casttypen, wo die Alarmglocken läuten wenn man sie benutzt. Diese sind technischer Natur und man sagt da dem Compiler, dass man etwas besser weiß als er und dass er gefälligst das Maul halten soll und keinen Felher generieren will. Mit diesen Arten von Casts kann man die constness von Objekten entfernen oder den Speicherbereich den Objekte belegen als einen ganz anderen Objekttyp auffassen als ursprünglich gedacht. ⚠ Wenn man dies benutzt sollte man aber ganz genau wissen, was man tut!

    und so wie Du es beschrieben hast, könnte ich auch

    (void)Blubb
    

    schreiben?

    Nein, denn von void kann es keine Instanzen geben.



  • Danke, SeppJ, dass wäre vorerst alles.

    Sollten weitere Fragen auftreten werde ich diese hier hineinposten.

    Mit freundlichen Grüßen,
    Understood.



  • SeppJ schrieb:

    und so wie Du es beschrieben hast, könnte ich auch

    (void)Blubb
    

    schreiben?

    Nein, denn von void kann es keine Instanzen geben.

    Das stimmt nicht. C++ erlaubt das Casten nach void von beliebigen Typen. Diese Sonderregel findet vor allem in Makros wie assert Anwendung.

    Static cast, §5.2.9/4 schrieb:

    Any expression can be explicitly converted to type “cv void.” The expression value is discarded.



  • Neue Fragen im ersten Post hinzugefügt.

    8. Was bedeutet folgende Zeile?

    System::Media::Soundplayer ^player
    

    9. Bezieht sich auf Frage 8.:
    Warum ist ein Häuschen-Zeichen (^) vor dem player?

    10. Warum kann ich viele Befehle der folgenden Seite nicht nutzen?
    http://msdn.microsoft.com/en-us/library/52cs05fz(v=VS.71).aspx

    Vielen Dank für Antworten.

    Mit freundlichen Grüßen,
    Understood.



  • Understood schrieb:

    Neue Fragen im ersten Post hinzugefügt.

    8. Was bedeutet folgende Zeile?

    System::Media::Soundplayer ^player
    

    9. Bezieht sich auf Frage 8.:
    Warum ist ein Häuschen-Zeichen (^) vor dem player?

    10. Warum kann ich viele Befehle der folgenden Seite nicht nutzen?
    http://msdn.microsoft.com/en-us/library/52cs05fz(v=VS.71).aspx

    3 Fragen, eine Antwort: du programmierst nicht in C++, sondern in C++/CLI.



  • Ad aCTa schrieb:

    > inline <Rückgabetyp> <Funktionsname>(<Parameter>). Was bedeutet das inline?
    [...]

    IMHO sollte man das bei einer Erklärung in zwei Aspekte aufteilen:
    1. Was ist "Inlining"?
    2. Die Rolle von "inline-Funktionen".

    ...wobei ich ausdrücklich betonen will, dass ich mit "inline-Funktion" eine Funktion meine, die entweder mit "inline" dekoriert wurde oder "implizit inline" ist, da sie innerhalb einer Klassendefinition definiert wurde.

    Ersteres wurde hier schon erklärt. Das "Inlining" ist Sache des Compilers. Es verändert nicht die Bedeuting eines Programms, da die Optimierung auf Basis der "as-if"-Regel durchgeführt wird.

    Der zweite kam hier meiner Meinung nach etwas zu kurz. Die Eigenschaft "inline/non-inline" einer Funktion verändert tatsächlich die Bedeutung des Programms. Der C++ Standard enthält Sonderregeln für inline-Funktionen. Ich verweise mal auf die "one-definition-rule". Diese behandelt nämlich inline-Funktionen anders als non-inline-Funktionen. Inline-Funktionen dürfen mehrfach definiert werden, solange nur maximal eine Definition innerhalb einer Übersetzungseinheit auftaucht und diese Mehrfachdefinitionen "äquivalent" sind. Eine weitere Regel besagt, dass wenn eine inline-Funktionen in einer ÜE benutzt wird, diese ÜE auch eine Definition dieser Funktion enthalten muss. Wenn man sich an diese Regeln hält, sollte es klar sein, dass ein Compiler es leichter hat eine inline-Funktion tatsächlich zu "inlinen"; denn auch wenn der Compiler ÜEs separat behandelt, liegen all die nötigen Informationen vor, die der Compiler braucht, um eine inline-Funktion zu "inlinen" zu können.

    Ob ein Compiler tatsächlich dieses "Inlining" durchführt, hängt typischerweise von Optimierungseinstellungen und Heuristiken ab. Ein "inline"-Schlüsselwort braucht diese Entscheidung gar nicht zu beeinflussen (as-if Regel). Aber die Idee ist, dem Compiler damit zu signalisieren, dass man es gerne etwas schneller haben würde an dieser Stelle -- zB wenn die Funktion irgendwo sehr oft in einer zeitkritischen Schleife aufgerufen wird.

    kk



  • 11. Was bedeutet, wenn man Funktion schreibt und danach beispielsweise ein ": bVariable" macht?

    void Function(int Par1, int Par2) : bVariable { ...; }
    

    Hoffe Ihr könnt mir helfen 😉

    Mit freundlichen Grüßen,
    Understood.


  • Mod

    Das gibt es nicht bei gewöhnlichen Funktionen. Die Schreibweise gibt es nur bei Konstruktoren, da nennt sich das Initialisierungsliste und wie der Name schon sagt initialisiert das Membervariablen mit den angegebenen Parametern. Wwobei du im Beispiel keine hast, was ziemlich sinnlos ist, weil die Member ohnehin Default-initialisiert werden wenn sie nicht in der Initialisierungliste auftauchen.

    Es gibt noch eine uralte C Schreibweise für Funktionsparameter die recht ähnlich aussieht, aber ich glaube nicht, dass du die meinst. Die wird soweit ich weiß in C++ (und glaube auch in neuerem C) nicht mehr (offiziell) unterstützt.



  • hausaufgabe?



  • @Understood
    Ich hoffe du lernst nicht mit der Schrott DVD von Video2Brain C++, der Typ da lässt ganz vieles einfach weg und scheint auch nicht der große Crack in C++ zu sein. Die 3 DVDs sind noch fast schlimmer als das Buch C++ von A bis Z, was dem Leser bei Hintergrundwissen auch im Regen stehen lässt.

    Es gibt echt eine menge Schrottbücher zu C++, die meisten eigentlich. Warum das so ist wurde hier auch schon diskutiert.



  • Ich habe ein Video-Tutorial (Einstieg für Anspruchsvolle), dann 2 Bücher - C++ - Lernen und Professionell anwenden und Einstieg in C++.
    Das Buch Einstieg in C++ wurde mir von meiner AutoIt-Community empfohlen, C++ - Lernen und Professionell anwenden war letztendlich meine eigene Entscheidung.

    Das Video-Tutorial wollte ich haben, um immer mal kurz und auf die schnelle etwas erklärt zu bekommen.

    Mit freundlichen Grüßen,
    Understood. 😉


Anmelden zum Antworten