C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

const member const

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Andrey Behrens
Guest





PostPosted: Thu Oct 28, 2004 9:25 am    Post subject: const member const Reply with 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
Karl Heinz Buchegger
Guest





PostPosted: Thu Oct 28, 2004 11:21 am    Post subject: Re: const member const Reply with quote



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





PostPosted: Thu Oct 28, 2004 11:22 am    Post subject: Re: const member const Reply with quote



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





PostPosted: Thu Oct 28, 2004 11:28 am    Post subject: Re: const member const Reply with quote

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





PostPosted: Thu Oct 28, 2004 11:54 am    Post subject: Re: const member const Reply with quote

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





PostPosted: Thu Oct 28, 2004 12:22 pm    Post subject: Re: const member const Reply with quote

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





PostPosted: Thu Oct 28, 2004 7:16 pm    Post subject: Re: const member const Reply with quote

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





PostPosted: Fri Oct 29, 2004 11:26 am    Post subject: Re: const member const Reply with quote

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





PostPosted: Fri Oct 29, 2004 11:52 am    Post subject: Re: const member const Reply with quote

[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.

Smile 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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.