3 Fragen zu C++ und VS (Visual Studio)
-
Sehr geehrtes Forum, ich lerne C++ jetzt schon so ca. 2 Wochen. Und durch das schreiben einer kleinen Library, habe ich auch viel gelernt, in sachen OOP in C++. Ich habe vorher 2 Jahre Java programmiert und war somit OOP-Pro. Die Syntax von C++ und co, da habe ich wirklich viel gelernt.
Und nun habe 3 Fragen zu C++ und besonders zum Visual Studio, weil ich jetzt langsam mit der GUI-Programmierung in C++ anfangen möchte.
Hier meine Fragen, danke für all eure Antworten!
- Ich bin noch etwas unsicher in den Basics, besonders wegen den Pointern, was für mich noch relativ neu, aber interessant ist,
Ich weiß zwar,
int zahl = 100; int* pointer_von_zahl = &zahl; // delete pointer_von_zahl; // oder // delete *pointer_von_zahl; // ???Das mit dem delete weiß ich aber nicht so genau, etwa so, wie es in dem kommentar steht?
Desweiteren will ich wissen, ob das zu viel arbeitsplatz kostet, wenn man methoden mit parameterübergabe so gestaltet, wie ich es bisher gemacht habe,
// Hier irgendwo ne Methode in einer Klasse int Methode (int n) { // tu etwas mit n } // Und so wird sie aufgerufen int a = 100; a = Methode(a);Wird da der ganze Integer-Wert kopiert? Was soll ich machen?
Wie kann man das optimieren?- Zur zweiten, etwas kürzeren Frage^^, also bei Java, bei meiner Eclipse IDE gabs einen Debugger, bei dem man sogar ein Fenster öffnen konnte, das anzeigte, wie viele ms Zeit eine Methode braucht. Wo gibts das bei Visual Studio, wie mach iche es da?
- Zu meiner dritten und letzten Frage:
Ich möchte mit den wxWidgets anfangen, in Sachen GUI-Programmierung.
Ich wollte wissen, wie man das in Visual Studio implementieren kann, oder welche Art von Projekt dazu erstellt werden muss.
Ich weiß, es sind viele große Fragen, aber ich hoffe, ihr könnt sie beantworten, und bin auch sehr dankbar.
M.f.G.Developer_X
- Ich bin noch etwas unsicher in den Basics, besonders wegen den Pointern, was für mich noch relativ neu, aber interessant ist,
-
Hallo,
zu 1.
delete ist nur erforderlich wenn du Speicher mit new vereinbarst hast. Hier als gar nicht.
Das int in deiner Funktion wird kopiert. Eine Alternative wäre eine Übergabe als konstante Referenz. Das macht für PODs (int, double, char etc.) aber keinen Sinn da es dort etwa genau soviel kostet wie eine Kopie.
Bei Klassen macht das eher Sinn. z.Bsp. stringsvoid meineStringFunktion(const std::string& str) { // mach was mit str }Hier wird der String nicht kopiert.
-
danke sehr,
aber kannst du mir das hier erklären?Ich use namespace std;
deshalb habe ich das std weg gemacht, warum const, warum &?const string& str
-
Developer_X schrieb:
const string& str
Durch die Übergabe als Referenz (&) sparst du dir eine Kopie des strings. Nun könnte die Funktion den string aber verändern. Um dem Aufrufer zu signalisieren dass die Funktion das nicht tut machst man das Objekt const. Damit sagst du dem Compiler auch dass er dir auf die Finger hauen soll falls du doch auf die Idee kommst das Objekt in der Funktion zu verändern.
Siehe const-correctness:
http://en.wikipedia.org/wiki/Const-correctness
http://www.parashift.com/c++-faq-lite/const-correctness.html
-
Ok, jetzt habe ich das verstanden, danke, aber das mit dieser "Referenz-Variante" geht bei mir zwar mit strings, aber nicht mit eigen Definierten Klassen, warum? →←↑↓
-
Du kannst (afaik) jeden Typ mit Referenzen verwenden.
class foo { void hello() { std::cout << "foo"; } }; void print( const foo& f ) { f.hello(); } int main() { foo f1; print( f1 ); return 0; }
-
Developer_X schrieb:
Ok, jetzt habe ich das verstanden, danke, aber das mit dieser "Referenz-Variante" geht bei mir zwar mit strings, aber nicht mit eigen Definierten Klassen, warum? →←↑↓
Was heisst "geht nicht"?
Zu deiner zweiten Frage im ersten Beitrag:
Das was du beschreibst ist nicht ein Debugger, sondern ein Profiler. Profiler gibt es auch für Visual Studio, die meisten kosten allerdings. Mach dir aber als Anfänger keine Gedanken über Performance, das hat so gut wie keinen Sinn. Zeigt auch deine Überlegung, wie man die Kopie eine Integers beschleunigen könnte. Diese Kopie ist eine so mikrige Operation, die fällt überhaupt nicht ins Gewicht. Dürfte sowieso schwer überhaupt irgendwie zu optimieren sein, denn irgendwie musst du den Wert an die Funktion übergeben. Wenn du zum Beispiel einen Zeiger übergibst, dann wird auch eine Kopie durchgeführt, einfach des Zeigers, welcher auf einer x86 Maschine wahrscheinlich genau gleich gross ist. Vergiss solche Überlegungen!Zu deiner dritten Frage im ersten Beitrag:
Lass die Finger von wxWidgets, wenn du noch nicht sattelfest in C++ bist. Allgemein, probier dich zuerst an C++ zu gewöhnen. Erst wenn du C++ richtig kannst, verwende neue und andere Bibliotheken. wxWidgets hat einen sehr alten und schlechten Stil, du würdest davon nur negativ beeinflusst werden. Vergiss jegliche graphische Programmierung fürs erste. Lern C++ zuerst rein auf der Konsole.Grüssli
-
Das hier geht nicht:
class Menu { public: // Attributes string menuTitle; // Constructor Menu(); // Methods void printMenu(const Console& c); }; // ... #include "StdAfx.h" #include <stdio.h> #include <iostream> #include <string> #include <vector> #include "Console.h" #include "Menu.h" void Menu::printMenu(const Console& c) { c.println(menuTitle); }Der Punkt zwischen c und println wird rot angezeigt. Der angebliche Fehler, überladen, overload. die methode println ist aber 100% public.
Was mache ich denn da falsch?
-
Dein Fehler ist, dass du eine nichtkonstante Methode auf ein konstantes Objekt anwenden willst. Entweder du musst die Methode println const machen oder c nicht als const Console übergeben.
void Console::println(const std::string& s) const /* <-- das hier */ { ... }Eine konstante Methode darf das Objekt, auf dem sie aufgerufen wird, nicht verändern.
-
ok danke euch allen.