c++ grundlagen, const IN
-
ich habe folgende fkt vorliegen
GetPos( IN int a, // was bedeutet dieses IN IN LPCTSTR b, IN LPCTSTR c = NULL) const; // wird hier default NULL eingeben? warum const am schluss noch?
-
c++noob schrieb:
ich habe folgende fkt vorliegen
GetPos( IN int a, // was bedeutet dieses IN IN LPCTSTR b, IN LPCTSTR c = NULL) const; // wird hier default NULL eingeben? warum const am schluss noch?
Das IN gibts eigentlich nicht in C++. Ist das, was du da hast, eine Microsoft-API? Ich glaube mich zu erinnern, dass die teilweise IN und OUT als leere Defines drin haben. D.h. das hat technisch überhaupt keinen Sinn, dient nur zur Dokumentation (vielleicht war der, der sich das ausgedacht hat, gefrusteter Ada-Programmierer).
Mit dem Default-Wert hast du Recht.
Das const am Ende bedeutet, dass die Funktion (es muss eine nichtstatische Memberfunktion sein) ihr Objekt nicht verändern kann:
class C { int a; public: int get() const { return a; // ok, Lesezugriff ist erlaubt } void set(int a_) { a = a_; // erlaubt, weil set nicht const ist } void func() const { a = 42; // verboten wg. const, gibt Compilerfehler } };
Das hat u.a. die Bedeutung, dass diese Funktion auf const-Objekte angewendet werden kann:
const C c; cout << c.get(); // erlaubt c.set(42); // nicht erlaubt, weil c const ist
-
das IN ist vermutlich ein define das sich jemand gebastelt hat. Was es bedeutet mußt Du in dem Quellcode nachlesen. Da steht bestimmt irgendwo
#define IN ...
Hier handelt es sich hier um eine Methode einer Klasse, oder?
Dann bedeutet das abschließende const, daß die Klasse für diese Methode konstant ist. Das heißt die Daten dürfen nicht modifiziert werden und es dürfen auch nur andere const-Methoden (die halt auch nix verändern) aufgerufen werden.
Funktionen, die nur irgendwelche Werte nachschlagen und zurückgeben können meistens const sein. Dann passiert es einem auch nicht, daß man irrtümlich was verändert.MfG Jester
-
super danke
warum kann ich nicht einfach
const BOOL blabla(...); schreiben? // warum BOOL blabla(...)const; // ist dies egal?
Ja es handelt sich um eine klassenmethode
und was bedeutet
_T ??
ein
_TINT = int
aber _T =
wie setze ich das sinnvoll ein?
-
Wenn Du das const vor die Funktion schreibst, dann bezieht es sich auf den Rückgabetypen. Das heißt: Die Funktion liefert in Deinem Fall einen konstanten BOOL zurück. Nur hintendran hat es die oben geschilderte Eigenschaft.
Dieser _T-kram ist mal wieder irgendein Makro, das sich jemand gebaut hat. Ob das sinnvoll einzusetzen ist halt ich für fraglich.
-
Sie dir deine Frage mal im Zusammanhang mit const-correctness an:
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=constcor#Answ
-
c++noob schrieb:
und was bedeutet
_T ??
ein
_TINT = int
aber _T =
wie setze ich das sinnvoll ein?
Das Makro ist in tchar.h definiert und macht deine Strings Unicode-konform. (Unicode ist ein "breiter" Zeichensatz, der nicht wie char zwischen 256, sondern zwischen 65536 oder noch mehr Zeichen unterscheiden kann. Unicode gibt es u.a. wegen der Mengen an ostasiatischen Schriftzeichen.)
_T ist etwa folgendermaßen definiert:
#ifdef _UNICODE #define _T(s) L ## s #else #define _T(s) s #endif
Wenn nun UNICODE definiert ist, so wird jeder String, der durch dieses Makro angegeben wird, ersetzt durch:
L"String"
Strings mit L-Präfix sind nicht vom Typ char*, sondern vom Typ wchar_t*.
Wenn du nun folgendes Programm schreibst:
test.c:
#include <windows.h> #include <tchar.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox (NULL, _T ("Hello World"), _T ("Window Caption"), 0); return (0); }
dann kannst du das Programm einfach durch Definition eines Makros als Unicode oder Nicht-Unicode-Programm kompilieren:
bcc32 -W -D_UNICODE test.c
ergibt ein Unicode-Programm, das auch unter japanischen Windowsversionen keinen Schrott ausgibt (dafür eigentlich aber nicht unter Win95/98/ME läuft, da diese keine Unicode-Befehle kennen, es würde aber in diesem Fall doch laufen, denn MessageBox ist eine der wenigen Funktionen, die auch unter Win95/98/ME als Unicode verfügbar sind)bcc32 -W test.c
ergibt ein normales Programm, das aber unter einem japanischen Windows Schrott ausgibt.
Falls du dich jetzt wunderst: man kann in C nicht etwa Funktionen überladen, sondern MessageBox ist in windows.h etwa so definiert:
#ifdef _UNICODE #define MessageBox MessageBoxW // wchar_t* - Version #else #define MessageBox MessageBoxA // char* - Version #endif
(auch wenn das alles eigentlich ins WinAPI-Forum gehört...)
Moritz
// edit: UNICODE in _UNICODE geändert
-
vielen dank, jetzt hab ich es ungefähr kapiert