ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4419845
Jetzt (Chat):
15 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
Sourcecode-Probleme
Schlüsselwörter im Detail
GepinntSeite: < 1 2 3
AutorThema
WOOLPH Offline
ZFX'ler


Registriert seit:
03.05.2002

Österreich
Re: Schlüsselwörter im DetailNach oben.
@Mis2com:
Der Zweck besteht darin, dass die Funktion, die Variablen der eigenen Klasse nicht verändern kann.

D.h. vorsichtige Programmiere schreiben vor die Funktion const, wenn sie im Voraus wissen das die Funktion, die Klassenvariablen nicht ändern darf. Sollte man jedoch trotzdem (versehentlich) einen Wert verändern gibt der Kompiler einen Fehler (oder Warnung) aus.

Kurzgesagt man braucht es kaum, außer man will auf Nummer sicher gehen!
11.08.2003, 15:16:46 Uhr
Eisflamme Offline
ZFX'ler


Registriert seit:
26.05.2002

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
Hngh, ich kenn das so:
Code:
wert func() const;


Aber das const kann also auch vor dem Rückgabewert stehen?
Wieder was gelernt.

MfG MAV
11.08.2003, 15:20:33 Uhr
Mihahome Revolution 2.0
Samuel Offline
ZFX'ler


Registriert seit:
25.02.2002

Schweiz
156346462
Re: Schlüsselwörter im DetailNach oben.
So ist es auch richtig. 'const void' macht keinen Sinn, da man kein konstantes Nichts zurückgeben kann. 'const' ist wenn möglich linksassoziativ, d. h. es bezieht sich auf den Wert links davon.
Folgendes kompiliert:
Code:
struct test1
{
    int t;
    const void func() { t = 0; }
};
struct test2
{
    int t;
    void const func() const { t = 0; }
};

Folgendes jedoch nicht:
Code:
struct test3
{
    int t;
    void func() const { t = 0; }
};
11.08.2003, 17:07:23 Uhr
Advanced creative implemented & developed Code
LoneStar Offline
ZFX'ler


Registriert seit:
27.03.2002

Griechenland
86505817
Re: Schlüsselwörter im DetailNach oben.
Zitat:
@Mis2com:
Der Zweck besteht darin, dass die Funktion, die Variablen der eigenen Klasse nicht verändern kann.

D.h. vorsichtige Programmiere schreiben vor die Funktion const, wenn sie im Voraus wissen das die Funktion, die Klassenvariablen nicht ändern darf. Sollte man jedoch trotzdem (versehentlich) einen Wert verändern gibt der Kompiler einen Fehler (oder Warnung) aus.

Kurzgesagt man braucht es kaum, außer man will auf Nummer sicher gehen!


Das const muss nach hinten und das gehört zum guten Stil, wenn man sooft const benutzt, wie es geht!
11.08.2003, 17:12:33 Uhr
WOOLPH Offline
ZFX'ler


Registriert seit:
03.05.2002

Österreich
Re: Schlüsselwörter im DetailNach oben.
Verdammt, das hab ich da hab ich mal wieder Sch**sse gebaut!!

Sorry, ich persönlich verwende const bei Methoden nicht sooft (sollte ich woll besser tun) drum ist mir da ein Fehler unterlaufen.

Code:
void funk(void) const; //Jetzt ist's richtig


PS: Warum stimmt die Formatierung des Quellcodes manchmal nicht
12.08.2003, 15:41:25 Uhr
Sefiroth Offline
ZFX'ler


Registriert seit:
17.11.2002

Nordrhein-Westfalen
69490471
Re: Schlüsselwörter im DetailNach oben.
Zitat:
@Mis2com:
Der Zweck besteht darin, dass die Funktion, die Variablen der eigenen Klasse nicht verändern kann.

D.h. vorsichtige Programmiere schreiben vor die Funktion const, wenn sie im Voraus wissen das die Funktion, die Klassenvariablen nicht ändern darf. Sollte man jedoch trotzdem (versehentlich) einen Wert verändern gibt der Kompiler einen Fehler (oder Warnung) aus.

Kurzgesagt man braucht es kaum, außer man will auf Nummer sicher gehen!


Ein wesentlicher Grund für const Methoden wäre, wenn man konstante Objekte hat. Denn nur konstante Methoden dürfen für konstante Objekte aufgerufen werden.

Code:
class A
{
public:
  void foo() const;
  void ChangeInt() { integer = 12345; }
private:
  int integer;
};

const A ca;
A a;
a.ChangeInt(); // OK
ca.ChangeInt(); // fehler
a.foo(); // OK
ca.foo(); // OK A::foo ist konstant


Muss man dennoch eine Variable ändern, kann man sie als mutable deklarieren. Man kann dann mit const_cast arbeiten, aber Vorsicht, da man nicht wissen kann, ob das Objekt auf physisch schreibgeschütztem Speicher liegt!
14.08.2003, 10:49:37 Uhr
Mastermind Offline
Knowledge-Admin


Registriert seit:
18.10.2002

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
Mann muss mutable natürlich richtig umgehen, sonst kann man const auch gleich lassen
14.08.2003, 11:01:24 Uhr
Work in Progress
WOOLPH Offline
ZFX'ler


Registriert seit:
03.05.2002

Österreich
Re: Schlüsselwörter im DetailNach oben.
@ Sefiroth:
Hab ich auch wieder was dazu gelernt, danke!
18.08.2003, 10:29:18 Uhr
BigAl77 Offline
ZFX'ler


Registriert seit:
13.01.2006

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
Hallo,

in der Zeit hätteste Dir auch n C++ Tutorial durchlesen können

Ich hab mir den ganzen Thread durchgelesen und fühl mich nicht wirklich schlauer als vorher.

Übrigens: es reicht normalerweise aus, wenn man ein grobes Verständnis von den Schlüsselwörtern hat.

Für alles andere gibts Spezielle Bücher oder Websites mit guten Tutorials.

Ich will jetzt hier nicht auch noch meine Interpretation der Schlüsselwörter verewigen, da man darüber schon n kleines Buch schreiben könnte, um all Fälle abzudecken.




15.01.2006, 00:42:25 Uhr
Bushido Offline
ZFX'ler


Registriert seit:
18.08.2005

Brandenburg
Re: Schlüsselwörter im DetailNach oben.
meiner meinung nach auch noch sehr coole schlüsselwörter sind:

__FILE__
- gibt den Dateiname an
__FUNCTION__ (in Borland C++: __FUNC__)
- gibt den Funktionsnamen an
__LINE__
- gibt die Zeilennummer an

damit lassen sich dann ganz schicke fehlermeldungen machen, besonders wenn man es noch mit einem Makro verbindet

Code:
//test.cpp
#define l_ErrorBox(text)(ErrorMessage (text,__FILE__,__FUNCTION__,__LINE__))

void ErrorMessage (char *Msg, char *Filename, char *Funcname, int Line)
{
    //.. Error-Dingens
}

void hallo()
{
    l_ErrorBox (\"huhu\");
}


Würde dann zB das ausgeben:
Fehlertext: huhu
Windowsfehlermeldung: Zugriff ...
Zeile: 10
Datei: test.cpp
Funktionsname: void hallo()
15.01.2006, 04:24:21 Uhr
Mastermind Offline
Knowledge-Admin


Registriert seit:
18.10.2002

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
verwechsle NIE Macros mit Schlüsselwörtern
16.01.2006, 17:05:38 Uhr
Work in Progress
Swordfighter Offline
Administrator


Registriert seit:
25.02.2002

England
Re: Schlüsselwörter im DetailNach oben.
wobei __FILE__, __FUNCTION__ und __LINE__ ja symbolische Konstanten des Praeprozessors sind (siehe daher auch den Post von Mastermind).
16.01.2006, 17:46:32 Uhr
Swordfighter's Realm
BigAl77 Offline
ZFX'ler


Registriert seit:
13.01.2006

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
Hiho,

konnts doch nicht sein lassen und hab mal in meiner alten C++ Bibel - Bjarne Stroustrup: Die C++ Programmiersprache - nachgeschaut:

Folgendes ist bei const in Zusammenhang mit Datentypen zu beachten:

const* char cp //ein konstanter Zeiger auf char
char const* cp //Zeiger auf konstantes char
const char* pc //Zeiger auf konstanten char

Bei Funktionen als Klassen Methoden hat const folgende Bedeutung:

class Datum{

int t, m, j;

public:
int tag() const {return t; }
int monat() const { return m; }
int jahr() const{ return j; }

};

Das const hier bedeutet, daß die Funktion den Zustand - d.h. Wert - von t, m und j nicht ändert.

Folgendes wäre also falsch:

int Datum::tag() {

return t++;
}

//Fehler konstante Funktion kann Wert von t nicht verändern

Es können übrigens auch Operator Funktion als const definiert werden:

//konvertierung von x nach int
operator int() const {return x; }

Ob man virtuelle Funktionen als const definieren kann, weiß ich nicht. Scheint auch keinen Sinn zu geben, da z. B. eine in einem Interface als virtuell deklarierte Funktion von der geerbten Klasse überschrieben bzw. das Objekt verändern können muß.

Soviel zu dem unscheinbaren Schlüsselwort const.




2 Mal gendert, zuletzt am 16.01.2006, 17:48:26 Uhr von BigAl77.
16.01.2006, 17:46:52 Uhr
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: Schlüsselwörter im DetailNach oben.
Oder auch:
http://www.zfx.info/FAQ.php?ID=48

Warum sollte eine virtuelle Methode / Funktion denn keinen Sinn machen? Überschreibt man so z.B. ein Enumerierungs-Get-Methode, macht das z.B. bei einem Renderdevice unter OpenGL/D3D8/D3D9 sehr wohl Sinn, da der Enumerierungsgetter den internen Zustand des Devices nicht modifizieren darf.

MfG Kimmi
16.01.2006, 17:54:38 Uhr
Kurzer Weblog
BigAl77 Offline
ZFX'ler


Registriert seit:
13.01.2006

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
Hi,

ich meinte
virtuelle const Funktion!!!


Virtuelle Funktionen machen natürlich Sinn.

Greets
16.01.2006, 19:18:18 Uhr
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: Schlüsselwörter im DetailNach oben.
Code:
enum RenderType {
    SOFTWARE = 0,
    D3D8=1,
    D3D9 = 2
};

class IRender {
    virtual ~Ifoo() {};
    const virtual RenderType EnumRenderDevice() const =0;
};

class ImpRenderD3D8 : public IRender {
    ...
    const RenderType EnumRenderDevice() const {
        return D3D8;
    }
};

Is zwar keine pure virtuelle Funktion, aber eine öglichkeit, ohne Templates per const Value ein Device zu enumerieren.
Alternativ könnte man so etwas für eine Info-Routine mit verschiedenen Enumerierungs-Parametern machen. Wichtig dabei: Sie dürfen nicht den internen Status des Objektes / Funktion gefährden. Ich bevorzuge zwar eher andere Lösungen, so etwas macht IMHO aber durchaus Sinn.

MfG Kimmi

1 Mal gendert, zuletzt am 16.01.2006, 19:24:57 Uhr von Kimmi.
16.01.2006, 19:24:31 Uhr
Kurzer Weblog
BigAl77 Offline
ZFX'ler


Registriert seit:
13.01.2006

Nordrhein-Westfalen
Re: Schlüsselwörter im DetailNach oben.
Hm,

sehr überzeugendes Beispiel.

Quasi eine Art konstante Get() Methode.

Könnte man machen, wenn man in abgeleiteten Klassen sicher gehen will, daß man auf jeden Fall nen konstanten Wert zurück kriegt.

Greets





16.01.2006, 19:40:18 Uhr
Halan Offline
ZFX'ler


Registriert seit:
22.01.2005

Bayern
Re: Schlüsselwörter im DetailNach oben.
okay wenn es schon so einen thread gibt,

kann mir jemand "explicit" erklären?

1 Mal gendert, zuletzt am 04.10.2008, 16:48:39 Uhr von Halan.
04.10.2008, 16:30:50 Uhr
klickverbot Offline
ZFX'ler


Registriert seit:
24.08.2008

Österreich
Re: Schlüsselwörter im DetailNach oben.
Zitat von Halan:
kann mir jemand "explecit" erklären?


Damit verhinderst du, dass ein Konstruktor mit nur einem Argument implizit zur Konvertierung aufgerufen wird.

Nehmen wir an, du hättest eine Klasse Test mit einem Konstruktor, der einen int als Argument akzeptierst. Dann könntest du folgendes machen: Test test = 43.
Das explicit-Schüsselwort verhindert diese implizite Konvertierung, du musst dann für die Konvertierung den Konstruktor explizit aufrufen: Test test = Test( 43 ).

Mehr findest du sicher bei der Internet-Suchmaschine deines Vertrauens.
04.10.2008, 16:48:27 Uhr
Halan Offline
ZFX'ler


Registriert seit:
22.01.2005

Bayern
Re: Schlüsselwörter im DetailNach oben.
Zitat von klickverbot:
Zitat von Halan:
kann mir jemand "explicit" erklären?


Damit verhinderst du, dass ein Konstruktor mit nur einem Argument implizit zur Konvertierung aufgerufen wird.

Nehmen wir an, du hättest eine Klasse Test mit einem Konstruktor, der einen int als Argument akzeptierst. Dann könntest du folgendes machen: Test test = 43.
Das explicit-Schüsselwort verhindert diese implizite Konvertierung, du musst dann für die Konvertierung den Konstruktor explizit aufrufen: Test test = Test( 43 ).

Mehr findest du sicher bei der Internet-Suchmaschine deines Vertrauens.


Oh wusste garnicht dass man konstruktoren so aufrufen kann.

Danke

Ps: sorry für den schreibfehler
04.10.2008, 16:50:02 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Schlüsselwörter im DetailNach oben.
In dem Beispiel ist der Regelfall nicht enthalten, nämlich die implizite Konvertierung beim Funktionsaufruf. Wenn du jetzt eine Funktion hinzufügst, welche Test als Parameter akzeptiert
Code:
int MachWas(Test EinParameter)
dann ist es ohne explicit ohne weiteres möglich zu schreiben:
Code:
MachWas(43);
weil der Compiler an dieser Stelle aus der 43 automatisch – also implizit – eine Instanz von Test anlegt, ihren Konstruktor mit 43 aufruft und dieses temporäre Objekt dann der Funktion übergibt.

Machst du den Konstruktor nun explicit, wird der Compiler nicht mehr automatisch konvertieren und ein solcher Funktionsaufruf zieht einen Fehler nach sich. Du musst stattdessen explizit schreiben
Code:
MachWas(Test(43));
und das temporäre Objekt damit selbst erzeugen.

Der Sinn: Einerseits die Performance – wenn der K'tor, D'tor und Zuweisungsoperator von Test sehr kompliziert sind, könnte die eine Zeile sehr sehr viel langsamer sein als es der Programmierer beabsichtigt hat. Er wird dann gezwungen, sich nochmal vor Augen zu führen, dass dort (und an allen andereren entsprechenden Stellen im Code) ein temporäres Objekt angelegt wird.

Andererseits kann der Code dadurch eindeutiger werden – wenn du MachWas noch für ints als Parameter überlädst, wird der Compiler die 43 dann konvertieren, bevor er sie der Funktion übergibt, oder nicht? In diesem Beispiel wird der Compiler abbrechen weil es zu uneindeutig ist, wenn man dann aber noch templates bedenkt kommt irgendwann noch mehr Murks dabei raus, wenn man es nicht explicit macht…

Ist also rein kosmetisch, allerdings nicht bloß so kosmetisch als dass es die Initialisierung anders aussehen lässt. Es kann auch das Überladen von Funktionen und templates klarer gestalten.

Zitat von klickverbot:
Mehr findest du sicher bei der Internet-Suchmaschine deines Vertrauens.
Der Thread ist doch extra dafür da, dass wir es hier erklären…

Gruß, Ky

1 Mal gendert, zuletzt am 04.10.2008, 17:34:23 Uhr von Krishty.
04.10.2008, 17:28:58 Uhr
Halan Offline
ZFX'ler


Registriert seit:
22.01.2005

Bayern
Re: Schlüsselwörter im DetailNach oben.
okay danke

Jetzt ist alles klar
04.10.2008, 18:03:12 Uhr
klickverbot Offline
ZFX'ler


Registriert seit:
24.08.2008

Österreich
Re: Schlüsselwörter im DetailNach oben.
Zitat von Krishty:
Zitat von klickverbot:
Mehr findest du sicher bei der Internet-Suchmaschine deines Vertrauens.
Der Thread ist doch extra dafür da, dass wir es hier erklären…


Das war nur darauf bezogen, dass die ersten drei Ergebnisse bei Google für "explicit" "c++" eigentlich recht brauchbar waren und ich gestern nicht die nötige Zeit hatte, um die eigentliche Problematik zu erläutern (die du dann eh geschildert hast).

Wo wir gerade dabei sind: Gibt es irgendeine sinnvolle Verwendung für auto in C++?

1 Mal gendert, zuletzt am 05.10.2008, 14:10:35 Uhr von klickverbot.
05.10.2008, 14:10:19 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Schlüsselwörter im DetailNach oben.
Mittlerweile nicht mehr, aber ab C++09 wird man es für automatische Typisierung verwenden können.
Code:
int i = 0;
auto j = i; // Compiler wird int als Typ von j bestimmen
Noch nützlicher wird es dann für eine neue Funktionsdeklaration, in welcher man den Rückgabetyp nach der Deklaration der Parameter bestimmen kann. Ich bin mir nicht ganz sicher, aber es dürfte so aussehen:
Code:
auto DoSomething(int x) -> int;
So richtig nützlich wird das dann mit templates, dann kann man mit dem neu eingeführten decltype() abhängig von den Typen der Parameter einen Rückgabetyp suchen. Aber das ist dann wieder ganz anderer Stoff.
05.10.2008, 15:26:25 Uhr
GepinntSeite: < 1 2 3


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel