 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Andrey Behrens Guest
|
Posted: Thu Oct 28, 2004 9:25 am Post subject: const member const |
|
|
Hallo,
ich bin hier in einem Projekt auf ein für mich eigenartiges Konstrukt gestoßen:
class A {
public:
A() {
foo = "Hallo Welt";
}
string& getFoo() {
cout << "A::getFoo()" <
return foo;
}
const string& getFoo() const {
cout << "const A::getFoo() const" <
return foo;
}
private:
string foo;
};
Man beachte das es getFoo() zweimal (einmal const, einmal nicht const) gibt.
Meine Frage nun: In welcher Situation wird die const-Funktion aufgerufen?
Mfg
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Thu Oct 28, 2004 11:21 am Post subject: Re: const member const |
|
|
Andrey Behrens wrote:
| Quote: |
Hallo,
ich bin hier in einem Projekt auf ein für mich eigenartiges Konstrukt gestoßen:
class A {
public:
A() {
foo = "Hallo Welt";
}
string& getFoo() {
cout << "A::getFoo()" <
return foo;
}
const string& getFoo() const {
cout << "const A::getFoo() const" <
return foo;
}
private:
string foo;
};
Man beachte das es getFoo() zweimal (einmal const, einmal nicht const) gibt.
Meine Frage nun: In welcher Situation wird die const-Funktion aufgerufen?
|
int main()
{
const A;
A.getFoo();
}
Hier ist das Objekt A const definiert. Es darf sich also unter keinen
Umstaenden veraendern. Aber: Woher soll der Compiler wissen, dass ein
Aufruf der Funktion getFoo() nicht genau das tun wird? Die Definition
der Funktion verraet ihm das. In diesem Fall kann der Compiler nur die
als const markierte getFoo() Funktion verwenden. Den das Objekt A darf
ja nicht veraendert werden und die const Funktion sichert genau dies
zu.
Man beachte auch: Im obigen Beispiel koennte man die 'nicht const'
Version von getFoo() auch weglassen. Beide Funktionen machen dasselbe
und der Aufruf einer const Funktion auf einem nicht-const Objekt stellt
kein Problem dar.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Christoph Rabel Guest
|
Posted: Thu Oct 28, 2004 11:22 am Post subject: Re: const member const |
|
|
Andrey Behrens wrote:
| Quote: |
ich bin hier in einem Projekt auf ein für mich eigenartiges Konstrukt gestoßen:
class A {
public:
A() {
foo = "Hallo Welt";
}
string& getFoo() {
cout << "A::getFoo()" <
return foo;
}
const string& getFoo() const {
cout << "const A::getFoo() const" <
return foo;
}
private:
string foo;
};
Man beachte das es getFoo() zweimal (einmal const, einmal nicht const) gibt.
Meine Frage nun: In welcher Situation wird die const-Funktion aufgerufen?
|
Dann wenn das Objekt const ist, also:
const A a_const;
a_const.getFoo(); // Ruft die const Version
A a_nonconst;
a_nonconst.getFoo(); // Ruft die nicht const deklarierte Version
mfg
Christoph
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andreas Huennebeck Guest
|
Posted: Thu Oct 28, 2004 11:28 am Post subject: Re: const member const |
|
|
Andrey Behrens wrote:
| Quote: | ich bin hier in einem Projekt auf ein für mich eigenartiges Konstrukt
gestoßen:
class A {
public:
A() {
foo = "Hallo Welt";
}
string& getFoo() {
cout << "A::getFoo()" <
return foo;
}
const string& getFoo() const {
cout << "const A::getFoo() const" <
return foo;
}
private:
string foo;
};
Man beachte das es getFoo() zweimal (einmal const, einmal nicht const)
gibt.
Meine Frage nun: In welcher Situation wird die const-Funktion aufgerufen?
|
Wenn eine Instanz der Klasse A selber const ist.
Tschau
Andreas
--
Andreas Hünnebeck | email: [email]ah (AT) despammed (DOT) com[/email]
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Thu Oct 28, 2004 11:54 am Post subject: Re: const member const |
|
|
Andrey Behrens wrote:
| Quote: | Hallo,
ich bin hier in einem Projekt auf ein für mich eigenartiges Konstrukt
gestoßen:
class A {
public:
A() {
foo = "Hallo Welt";
}
string& getFoo() {
cout << "A::getFoo()" <
return foo;
}
const string& getFoo() const {
cout << "const A::getFoo() const" <
return foo;
}
private:
string foo;
};
Man beachte das es getFoo() zweimal (einmal const, einmal nicht const)
gibt.
Meine Frage nun: In welcher Situation wird die const-Funktion aufgerufen?
|
Wenn das Objekt, für das sie aufgerufen wird, const ist.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Thu Oct 28, 2004 12:22 pm Post subject: Re: const member const |
|
|
Andrey Behrens wrote:
| Quote: | class A {
public:
A() {
foo = "Hallo Welt";
}
string& getFoo() {
cout << "A::getFoo()" <
return foo;
}
const string& getFoo() const {
cout << "const A::getFoo() const" <
return foo;
}
private:
string foo;
};
Man beachte das es getFoo() zweimal (einmal const, einmal nicht const) gibt.
Meine Frage nun: In welcher Situation wird die const-Funktion aufgerufen?
|
Stets dann, wenn der Funktionsaufruf über einen const-qualifizierten Zugriffspfad
erfolgt:
A nichtkonstantes_aah;
A const konstantes_aah;
A const& konstanter_Zugriff_auf_nichtkonstantes_aah = nichtkonstantes_aah;
nichtkonstantes_aah.getFoo() = "Goodby, cruel world!"; // OK: Aufruf von "A::getFoo()"
konstantes_aah.getFoo() = "Und tschüs!"; // KO: Aufruf von "A::getFoo() const", daher Zuweisung nicht möglich
konstanter_Zugriff_auf_nichtkonstantes_aah.getFoo() = "Va chier !"; // KO: "A::getFoo() const", siehe oben
Die Auswahl hängt *nicht* davon ab, ob das Funktionsresultat tatsächlich benutzt
wird, um das Objekt zu verändern:
std::cout << nichtkonstantes_aah.getFoo() << 'n'; // Aufruf von "A::getFoo()", obwohl nur Lesezugriff erfolgt
In vielen Fällen vermeidet man es, nicht const-qualifizierte Zugriffspfade (per
Referenz oder Zeiger) auf private Attribute von Objekten zurückzugeben, da es
diese jedem hergelaufenen Eumel ermöglichen, das Objekt unkontrolliert (ohne
die wohldefinierte öffentliche Schnittstelle zu benutzen) zu verändern und daher
die schöne Kapselung zum Deibel geht. Natürlich gibt es auch Ausnahmen von dieser
Designregel, insbesondere bei Containerklassen. In diesem Fall ist die Überladung
auf const / nicht const der Zugriffsfunktionen ratsam und üblich, siehe z.B.
"std::vector::operator[](size_type)".
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
M. Hrabowski Guest
|
Posted: Thu Oct 28, 2004 7:16 pm Post subject: Re: const member const |
|
|
Die const Variante wird aus einem Kontext heraus aufgerufen, in die Instanz
der betroffenen Klasse const ist, d.h. aus z.B. aus einer anderen const
Methode derselben Klasse oder einer anderen Methode, der die Instanz der
Klasse als const übergeben wurde.
Ein gutes Beispiel hierfür sind die container der Standardbibliothek. Diese
haben alle const und non-const varianten für begin() und end(). Das
ermöglicht, das auf diese über const_iterator(en) nur lesbar zugegriffen
werden kann.
| Quote: | Hallo,
ich bin hier in einem Projekt auf ein für mich eigenartiges Konstrukt
gestoßen:
class A {
public:
A() {
foo = "Hallo Welt";
}
string& getFoo() {
cout << "A::getFoo()" <
return foo;
}
const string& getFoo() const {
cout << "const A::getFoo() const" <
return foo;
}
private:
string foo;
};
Man beachte das es getFoo() zweimal (einmal const, einmal nicht const)
gibt.
Meine Frage nun: In welcher Situation wird die const-Funktion aufgerufen?
Mfg
|
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Oct 29, 2004 11:26 am Post subject: Re: const member const |
|
|
Karl Heinz Buchegger <kbuchegg (AT) gascad (DOT) at> wrote
| Quote: | Andrey Behrens wrote:
ich bin hier in einem Projekt auf ein für mich eigenartiges
Konstrukt gestoßen:
class A {
public:
A() {
foo = "Hallo Welt";
}
string& getFoo() {
cout << "A::getFoo()" <
return foo;
}
const string& getFoo() const {
cout << "const A::getFoo() const" <
return foo;
}
private:
string foo;
};
Man beachte das es getFoo() zweimal (einmal const, einmal nicht
const) gibt.
Meine Frage nun: In welcher Situation wird die const-Funktion
aufgerufen?
int main()
{
const A;
A.getFoo();
}
Hier ist das Objekt A const definiert. Es darf sich also unter keinen
Umstaenden veraendern. Aber: Woher soll der Compiler wissen, dass ein
Aufruf der Funktion getFoo() nicht genau das tun wird? Die Definition
der Funktion verraet ihm das. In diesem Fall kann der Compiler nur die
als const markierte getFoo() Funktion verwenden. Den das Objekt A darf
ja nicht veraendert werden und die const Funktion sichert genau dies
zu.
|
Mehr oder weniger:-). Was du sagst stimmt ganz genau nach der Norm,
aber...
In der Tat bestimmt meistens der Programmierer, was const auf seinem
Objekt bedeutet. Z.B. wenn ich eine String-Klasse haben, die einen char*
enthält, dann laut der Norm darf Zeichen in der Kette auch in
const-Objekten geändert werden, weil auch in const-Objekten zeigt der
char* nicht const. Gewöhnlicherweise aber deklariert man Funktionnen,
die zur Veränderungen der Zeichen führen, auch const. (Vor etwa 10
Jahren gab es viele Diskussion über dieser Thema, unter dem Begriff :
logische Const gegen bitweise Const. Heute habe ich ehe den Eindruck,
dass es ein Konsensus für logische Const gibt.)
| Quote: | Man beachte auch: Im obigen Beispiel koennte man die 'nicht const'
Version von getFoo() auch weglassen. Beide Funktionen machen dasselbe
und der Aufruf einer const Funktion auf einem nicht-const Objekt
stellt kein Problem dar.
|
Achtung auf den Rückgabetyp:
A const a1 ;
A a2 ;
a1.getFoo() = "bar" ; // illegal
a2.getFoo() = "bar" ; // legal
Der Unterschied besteht nur deshalb, weil unterschiedene Versionen von
getFoo aufgerufen werden.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Fri Oct 29, 2004 11:52 am Post subject: Re: const member const |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:
| Quote: |
ja nicht veraendert werden und die const Funktion sichert genau dies
zu.
Mehr oder weniger:-). Was du sagst stimmt ganz genau nach der Norm,
aber...
In der Tat bestimmt meistens der Programmierer, was const auf seinem
Objekt bedeutet.
|
Ja, klar.
Im schlimmsten vorstellbaren Fall, koennte der Programmierer immer noch
das const weg-casten und in der Funktion schlimmes treiben.
| Quote: | Z.B. wenn ich eine String-Klasse haben, die einen char*
enthält, dann laut der Norm darf Zeichen in der Kette auch in
const-Objekten geändert werden, weil auch in const-Objekten zeigt der
char* nicht const.
|
Yep.
Allerdings ist der Zeiger selbst perverseweise const geschuetzt.
So ist halt das Leben als C++ Programmierer.
Ich seh das so: Das Typsystem ist eine Art Fangnetz das mich allerdings
nicht davor entbindet darueber nachzudenken was ich denn nun schreibe.
Ich habe zB auch ein Problem mit Compiler-Warnungen, wenn das angemahnte
Code-Problem nicht in allen Situationen zuverlaessig erkannt werden kann.
Das Problem: Zuviele Leute wiegen sich in Sicherheit ala: "Das kann kein
Problem xxx sein, mein Compiler haette da eine Warnung ausgespuckt.
Also denk ich gar nicht weiter darueber nach".
| Quote: | Gewöhnlicherweise aber deklariert man Funktionnen,
die zur Veränderungen der Zeichen führen, auch const. (Vor etwa 10
Jahren gab es viele Diskussion über dieser Thema, unter dem Begriff :
logische Const gegen bitweise Const. Heute habe ich ehe den Eindruck,
dass es ein Konsensus für logische Const gibt.)
|
Also: Wenn sich der nach aussen hin sichtbare Zustand eines Objektes
nicht aendert. 'Nach aussen hin sichtbare Zustand' heist noch lange nicht
das sich an den Internals nichts veraendern darf.
| Quote: |
Man beachte auch: Im obigen Beispiel koennte man die 'nicht const'
Version von getFoo() auch weglassen. Beide Funktionen machen dasselbe
und der Aufruf einer const Funktion auf einem nicht-const Objekt
stellt kein Problem dar.
Achtung auf den Rückgabetyp:
|
Erwischt: Auf den hab ich nicht geachtet.
Widerruf: Im Beispiel des koennte man *nicht* die non-const Version
einsparen.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|