"Alain Naigeon" wrote in message
news:<409ff472$0$20757$...a écrit dans le message news:"Alain Naigeon" wrote in message
news:<409ea014$0$21078$..."James Kanze" a écrit dans le message news:drkm writes:
|> "Alain Naigeon" writes:
|> > Mais je ne comprends pas ce que
|> > tu ne comprends pas ici :-o
|> Je pense qu'il a mal compris ma formulation, et l'a prise
|> dans le sens « fonction membre » ou « variable membre ».
Tout à fait. Le concepte de membre de classe par rapport au
membre d'instance ne fait pas partie de C++. On ne parle que des
« membres de classes », y compris pour ce que dans d'autres
langages, on appelle « membres d'instance ». Et dans l'absence
de l'expression « membres d'instance », j'imaginais la
signification C++, et non la signification qu'il a voulu (qui
est très courante dans d'autres langages orientés objet).
Quand on parle *de* C++, on ne parle pas *en* C++ - comment alors
veux-tu conceptualiser la différence fondamentale entre les deux
cas ?
Quand on parle de C++, on utilise un vocabulaire propre, de même que
quand on parle de n'importe quel autre langage. Donc, quand je parle
de C++, je parle des fonctions (membre ou non), tandis que quand je
parle de Java, je parle des méthodes (qui peuvent aussi être
statiques).
Oui mais : C++ fut créé, alors que les concepts objet, incarnés dans
d'autres langages, commençaient à avoir du succès. Il fut créé de
façon "réaliste" (compatibilité C, etc) pour avoir une bonne chance
d'être adopté en pratique. C'est réussi, bravo. Ceci dit, je ne vois
pas ce qui empêche d'emprunter le vocabulaire utilisé couramment alors
pour ces concepts objet.
Rien n'empêchait. Et en fait, beaucoup de vocabulaire a été emprunté du
langage OO -- on parle bien d'héritage, des classes dérivées, etc.
Stroustrup a décidé de ne pas suivre le nomenclature « membre de
classe@» / « membre d'instance ». Je ne connais pas la raison derrière
cette décision, mais il ne me gène pas outre-mésure.
"Alain Naigeon" <anaigeon@free.fr> wrote in message
news:<409ff472$0$20757$626a14ce@news.free.fr>...
<kanze@gabi-soft.fr> a écrit dans le message news:
d6652001.0405092331.7bb9203c@posting.google.com...
"Alain Naigeon" <anaigeon@free.fr> wrote in message
news:<409ea014$0$21078$626a14ce@news.free.fr>...
"James Kanze" <kanze@gabi-soft.fr> a écrit dans le message news:
86u0yq7xhb.fsf@lns-th2-1-82-64-2-191.adsl.proxad.net...
drkm <usenet.fclcxx@fgeorges.org> writes:
|> "Alain Naigeon" <anaigeon@free.fr> writes:
|> > Mais je ne comprends pas ce que
|> > tu ne comprends pas ici :-o
|> Je pense qu'il a mal compris ma formulation, et l'a prise
|> dans le sens « fonction membre » ou « variable membre ».
Tout à fait. Le concepte de membre de classe par rapport au
membre d'instance ne fait pas partie de C++. On ne parle que des
« membres de classes », y compris pour ce que dans d'autres
langages, on appelle « membres d'instance ». Et dans l'absence
de l'expression « membres d'instance », j'imaginais la
signification C++, et non la signification qu'il a voulu (qui
est très courante dans d'autres langages orientés objet).
Quand on parle *de* C++, on ne parle pas *en* C++ - comment alors
veux-tu conceptualiser la différence fondamentale entre les deux
cas ?
Quand on parle de C++, on utilise un vocabulaire propre, de même que
quand on parle de n'importe quel autre langage. Donc, quand je parle
de C++, je parle des fonctions (membre ou non), tandis que quand je
parle de Java, je parle des méthodes (qui peuvent aussi être
statiques).
Oui mais : C++ fut créé, alors que les concepts objet, incarnés dans
d'autres langages, commençaient à avoir du succès. Il fut créé de
façon "réaliste" (compatibilité C, etc) pour avoir une bonne chance
d'être adopté en pratique. C'est réussi, bravo. Ceci dit, je ne vois
pas ce qui empêche d'emprunter le vocabulaire utilisé couramment alors
pour ces concepts objet.
Rien n'empêchait. Et en fait, beaucoup de vocabulaire a été emprunté du
langage OO -- on parle bien d'héritage, des classes dérivées, etc.
Stroustrup a décidé de ne pas suivre le nomenclature « membre de
classe@» / « membre d'instance ». Je ne connais pas la raison derrière
cette décision, mais il ne me gène pas outre-mésure.
"Alain Naigeon" wrote in message
news:<409ff472$0$20757$...a écrit dans le message news:"Alain Naigeon" wrote in message
news:<409ea014$0$21078$..."James Kanze" a écrit dans le message news:drkm writes:
|> "Alain Naigeon" writes:
|> > Mais je ne comprends pas ce que
|> > tu ne comprends pas ici :-o
|> Je pense qu'il a mal compris ma formulation, et l'a prise
|> dans le sens « fonction membre » ou « variable membre ».
Tout à fait. Le concepte de membre de classe par rapport au
membre d'instance ne fait pas partie de C++. On ne parle que des
« membres de classes », y compris pour ce que dans d'autres
langages, on appelle « membres d'instance ». Et dans l'absence
de l'expression « membres d'instance », j'imaginais la
signification C++, et non la signification qu'il a voulu (qui
est très courante dans d'autres langages orientés objet).
Quand on parle *de* C++, on ne parle pas *en* C++ - comment alors
veux-tu conceptualiser la différence fondamentale entre les deux
cas ?
Quand on parle de C++, on utilise un vocabulaire propre, de même que
quand on parle de n'importe quel autre langage. Donc, quand je parle
de C++, je parle des fonctions (membre ou non), tandis que quand je
parle de Java, je parle des méthodes (qui peuvent aussi être
statiques).
Oui mais : C++ fut créé, alors que les concepts objet, incarnés dans
d'autres langages, commençaient à avoir du succès. Il fut créé de
façon "réaliste" (compatibilité C, etc) pour avoir une bonne chance
d'être adopté en pratique. C'est réussi, bravo. Ceci dit, je ne vois
pas ce qui empêche d'emprunter le vocabulaire utilisé couramment alors
pour ces concepts objet.
Rien n'empêchait. Et en fait, beaucoup de vocabulaire a été emprunté du
langage OO -- on parle bien d'héritage, des classes dérivées, etc.
Stroustrup a décidé de ne pas suivre le nomenclature « membre de
classe@» / « membre d'instance ». Je ne connais pas la raison derrière
cette décision, mais il ne me gène pas outre-mésure.
"Alain Naigeon" writes:
[...]
| A propos de la différence de sens entre class dans "class data member"
| et dans "membre de classe" (par opposition à membre d'instance), j'ai
| comme l'impression que tout s'éclaire si l'on se souvient que dans
certains
| langages (pas très populaires, il me semble, hélas), les classes sont
des
| objets.
| Alors, bien sûr, ce n'est pas le cas en C++, donc la classe C++, en tant
que
| type, est, au fond "static".
Autrement dit, c'est une valeur/objet compile-time, cela ne me choque
pas du tout et je trouve que c'est un point de vue intéressant quand par
exemple, on veut manipuler les types et les templates (qui sont alors
des fonctions vers des types) d'une certaine manière qu'il est convenu
d'appeler, nébuleusement, « méta-programmation. » J'ai expliqué
ce point de vue, par exemple, à la « Association of C and C++ Users
Spring Conference » d'avril 2001. Voir
http://www.cmla.ens-cachan.fr/~dosreis/C++/talks/metaprogramming-in-cxx.pdf
C'est également un point de vue largement adopté chez Boost.
Je n'irai pas cependant jusqu'à prétendre que c'est un point de vue
universellement reconnu. Une preuve est ce thread ;-).
Mais ce qui est sûr, c'est que l'inventeur du langage et des experts
comme Francis Glassborrow comprennent static appliqué aux member d'une
classe de cette manière.
-- Gaby
"Alain Naigeon" <anaigeon@free.fr> writes:
[...]
| A propos de la différence de sens entre class dans "class data member"
| et dans "membre de classe" (par opposition à membre d'instance), j'ai
| comme l'impression que tout s'éclaire si l'on se souvient que dans
certains
| langages (pas très populaires, il me semble, hélas), les classes sont
des
| objets.
| Alors, bien sûr, ce n'est pas le cas en C++, donc la classe C++, en tant
que
| type, est, au fond "static".
Autrement dit, c'est une valeur/objet compile-time, cela ne me choque
pas du tout et je trouve que c'est un point de vue intéressant quand par
exemple, on veut manipuler les types et les templates (qui sont alors
des fonctions vers des types) d'une certaine manière qu'il est convenu
d'appeler, nébuleusement, « méta-programmation. » J'ai expliqué
ce point de vue, par exemple, à la « Association of C and C++ Users
Spring Conference » d'avril 2001. Voir
http://www.cmla.ens-cachan.fr/~dosreis/C++/talks/metaprogramming-in-cxx.pdf
C'est également un point de vue largement adopté chez Boost.
Je n'irai pas cependant jusqu'à prétendre que c'est un point de vue
universellement reconnu. Une preuve est ce thread ;-).
Mais ce qui est sûr, c'est que l'inventeur du langage et des experts
comme Francis Glassborrow comprennent static appliqué aux member d'une
classe de cette manière.
-- Gaby
"Alain Naigeon" writes:
[...]
| A propos de la différence de sens entre class dans "class data member"
| et dans "membre de classe" (par opposition à membre d'instance), j'ai
| comme l'impression que tout s'éclaire si l'on se souvient que dans
certains
| langages (pas très populaires, il me semble, hélas), les classes sont
des
| objets.
| Alors, bien sûr, ce n'est pas le cas en C++, donc la classe C++, en tant
que
| type, est, au fond "static".
Autrement dit, c'est une valeur/objet compile-time, cela ne me choque
pas du tout et je trouve que c'est un point de vue intéressant quand par
exemple, on veut manipuler les types et les templates (qui sont alors
des fonctions vers des types) d'une certaine manière qu'il est convenu
d'appeler, nébuleusement, « méta-programmation. » J'ai expliqué
ce point de vue, par exemple, à la « Association of C and C++ Users
Spring Conference » d'avril 2001. Voir
http://www.cmla.ens-cachan.fr/~dosreis/C++/talks/metaprogramming-in-cxx.pdf
C'est également un point de vue largement adopté chez Boost.
Je n'irai pas cependant jusqu'à prétendre que c'est un point de vue
universellement reconnu. Une preuve est ce thread ;-).
Mais ce qui est sûr, c'est que l'inventeur du langage et des experts
comme Francis Glassborrow comprennent static appliqué aux member d'une
classe de cette manière.
-- Gaby
writes:
| Gabriel Dos Reis wrote in message
| news:...
| > "Alain Naigeon" writes:
| > | Car, ne t'en déplaise, les notions de classe et d'instance ont
| > | un sens général qui n'est pas à mettre à la poubelle simplement
| > | parce qu'un langage en particulier les a adoptés pour nommer ses
| > | propres implémentations particulières. Chacun ses goûts ; pour
| > | moi, "storage class" reflète, hélas (3 fois), une mentalité
| > | "proche de la machine" dont on sait bien d'où elle vient.
| > La notion de « class » en C++ est empruntée à Simula -- et ne
| > désigne pas ce que le comité C et C++ ont décidé d'appeler dans un
| > jargon obscure « storage class ».
| Attention. Il n'y a aucun rapport entre le mot clé class et le
| concepte de classe qu'il incarne, et le « class » dans « storage
| class » (que je traduirais plutôt par « catégorie » en français).
Ce n'est pas ce que j'ai dit ? À quoi dois-je faire attention ?
| Quand j'entends « membre de classe », je ne fais aucun rapprochement
| à « storage class », qui est un mot qu'on a hérité de C.
| Et c'est un mot qui n'a aucune autre signification réele que de
| désigner la liste des mots clé qui en font partie. Certains de ces
| mots clé affectent le « linkage » du symbole, d'autres la durée de
| vie de l'objet qu'il désigne, « static » a une signification tout
| particulière dans une classe, et en C, même « typedef » est un «
| storage class ».
et noté que le comité C dit clairement qu'il prétend que « typedef »
est un « storage class specifier » uniquement pour des raisons de
convenance, et non pas qu'il pense qu'il en est un réellement au sens
classique.
kanze@gabi-soft.fr writes:
| Gabriel Dos Reis <gdr@integrable-solutions.net> wrote in message
| news:<m3llk0c7fo.fsf@uniton.integrable-solutions.net>...
| > "Alain Naigeon" <anaigeon@free.fr> writes:
| > | Car, ne t'en déplaise, les notions de classe et d'instance ont
| > | un sens général qui n'est pas à mettre à la poubelle simplement
| > | parce qu'un langage en particulier les a adoptés pour nommer ses
| > | propres implémentations particulières. Chacun ses goûts ; pour
| > | moi, "storage class" reflète, hélas (3 fois), une mentalité
| > | "proche de la machine" dont on sait bien d'où elle vient.
| > La notion de « class » en C++ est empruntée à Simula -- et ne
| > désigne pas ce que le comité C et C++ ont décidé d'appeler dans un
| > jargon obscure « storage class ».
| Attention. Il n'y a aucun rapport entre le mot clé class et le
| concepte de classe qu'il incarne, et le « class » dans « storage
| class » (que je traduirais plutôt par « catégorie » en français).
Ce n'est pas ce que j'ai dit ? À quoi dois-je faire attention ?
| Quand j'entends « membre de classe », je ne fais aucun rapprochement
| à « storage class », qui est un mot qu'on a hérité de C.
| Et c'est un mot qui n'a aucune autre signification réele que de
| désigner la liste des mots clé qui en font partie. Certains de ces
| mots clé affectent le « linkage » du symbole, d'autres la durée de
| vie de l'objet qu'il désigne, « static » a une signification tout
| particulière dans une classe, et en C, même « typedef » est un «
| storage class ».
et noté que le comité C dit clairement qu'il prétend que « typedef »
est un « storage class specifier » uniquement pour des raisons de
convenance, et non pas qu'il pense qu'il en est un réellement au sens
classique.
writes:
| Gabriel Dos Reis wrote in message
| news:...
| > "Alain Naigeon" writes:
| > | Car, ne t'en déplaise, les notions de classe et d'instance ont
| > | un sens général qui n'est pas à mettre à la poubelle simplement
| > | parce qu'un langage en particulier les a adoptés pour nommer ses
| > | propres implémentations particulières. Chacun ses goûts ; pour
| > | moi, "storage class" reflète, hélas (3 fois), une mentalité
| > | "proche de la machine" dont on sait bien d'où elle vient.
| > La notion de « class » en C++ est empruntée à Simula -- et ne
| > désigne pas ce que le comité C et C++ ont décidé d'appeler dans un
| > jargon obscure « storage class ».
| Attention. Il n'y a aucun rapport entre le mot clé class et le
| concepte de classe qu'il incarne, et le « class » dans « storage
| class » (que je traduirais plutôt par « catégorie » en français).
Ce n'est pas ce que j'ai dit ? À quoi dois-je faire attention ?
| Quand j'entends « membre de classe », je ne fais aucun rapprochement
| à « storage class », qui est un mot qu'on a hérité de C.
| Et c'est un mot qui n'a aucune autre signification réele que de
| désigner la liste des mots clé qui en font partie. Certains de ces
| mots clé affectent le « linkage » du symbole, d'autres la durée de
| vie de l'objet qu'il désigne, « static » a une signification tout
| particulière dans une classe, et en C, même « typedef » est un «
| storage class ».
et noté que le comité C dit clairement qu'il prétend que « typedef »
est un « storage class specifier » uniquement pour des raisons de
convenance, et non pas qu'il pense qu'il en est un réellement au sens
classique.
writes:
| Rien n'empêchait. Et en fait, beaucoup de vocabulaire a été emprunté
| du langage OO -- on parle bien d'héritage, des classes dérivées,
| etc. Stroustrup a décidé de ne pas suivre le nomenclature « membre
| de classe » / « membre d'instance ». Je ne connais pas la raison
| derrière cette décision, mais il ne me gène pas outre-mésure. Dans
| d'autres cas, par exemple quand il a décidé de ne pas utiliser «
| subclass » et « superclass », il a expliqué pourquoi. Mais pas ici,
| ou plutôt, je n'ai jamais vu une explication. Peut-être Gaby en
| connaît une (bien que comme j'ai dit, je ne trouve pas qu'une
| explication soit nécessaire).
J'ai bien lu ta phrase entre parenthèses mais je ne comprends pas très
bien tes deux premières phrases. Comme tu le sais,
C++ emprunte directement à C et Simula.
Simula est le premier langage orienté objet et comme Stroustrup
l'explique régulièrement, « C++ borrows its terminology from Simula
rather than from Smalltalk. » En Simula, une classe est une collection
de fonctions et de données, et je trouve naturel d'appeler les
éléments de cette collection les « membres de cette classe. »
En ce qui concerne la notion de « static » appliqué aux membres d'une
classe, il m'a toujours paru que Stroustrup l'expliquait autrement que
par le circulaire « static en C++ a une définition précise et cela
veut dire exactement ce que la norme C++ veut dire par là. »
Certes, cette assertion n'est pas fausse mais cela ne donne pas une
idée de ce que c'est. Comme, je n'arrive pas à trouver sommeil parce
qu'il fait chaud, je me suis occupé à trouver une référence à
l'explication que Stroustrup donne -- mon examplaire d'ARM est
malheureusement au bureau. Donc du D&E, §13.4, page 288
A static data member of a class is a member for which there is only
one copy rather than one per object. Consequently, a static member
can be accessed without referring to any particular object.
Ici, Stroustrup essaie d'expliquer en des termes simples et généraux
la signification de « static » appliqué aux membres d'une classe.
Il commence par rappeler que « static » appliqué à une donnée membre
veut dire qu'il existe exactement une copie de cette donnée dans tout
le programme, au lieu d'avoir une copie (membre) par objet (ou
instance) de cette classe.
Cette signification est très proche de la signification originelle de
« static » appliquée à une variable locale -- telle que Dennis Ritchie
l'imaginait,
avant qu'il décide un jour de réutiliser ce même mot clé pour dire
qu'une donnée/fonction est locale à une unité de traduction (ce dont
il n'est pas fier, et il l'avoue publiquement).
Il faut bien ici voir la différence avec une variable locale qui
aurait une durée de stockage automatique.
Une telle variable locale est conceptuellement « instanciée » à chaque
appel à la fonction qui la contient ou, en jargon technique, à chaque
activation de la structure de calcul de la fonction. Donc, tout comme
les données membres des objets d'une classe donnée, il existe une
copie par activation. L'utilisation de « static », comme Dennis
Ritchie l'a conçu au départ, c'est pour dire qu'une telle donnée
n'appartient pas à une instance particulière de la fonction, mais à
toutes les instances de la fonction. En somme, la notion de donnée
membre statique telle que Stroustrup l'a conçue est une excellente
généralisation de variable locale statique conçue par Ritchie.
Une fois rappelée cette idée qu'une donnée membre statique est, par
définition, l'idée même qu'il en existe une et une seule copie et
qu'elle n'appartient pas à un objet particulier, Stroustrup poursuit :
A static member function is not associated with any particular
object and need not be called using the special function syntax.
Il me paraît évident que la notion de static appliqué à un membre
d'une classe (que ce soit une donnée ou une fonction) est cohérente.
Il me smeble qu'on l'expliquer en des termes généraux autres que ceux
que la norme C++ utilise, comme Stroustrup le fait, sans en vider la
substance ni la dénaturer.
| Je ne vois pas de problème non plus à utiliser ce vocabulaire ici,
| même
Je ne crois pas que le problème soit l'utilisation du vocabulaire ici,
mais plutôt la question de parler uniquement *de* C++ *en* C++.
| si Stroustrup et la norme ne s'en sert pas. Seulement, il ne faut
| pas
Il me semble que Stroustrup n'hésite pas une seconde à aller au delà
du sous-ensemble très restreint de vocabulaire utilisé par la norme.
Je ne pense pas que la question soit de savoir si le vocabulaire de la
norme C++ est interdit ici. Je crois qu'il est plutôt possible et
utile d'expliquer les concepts de C++ autrement que par le vocabulaire
limité utilisé par la norme.
kanze@gabi-soft.fr writes:
| Rien n'empêchait. Et en fait, beaucoup de vocabulaire a été emprunté
| du langage OO -- on parle bien d'héritage, des classes dérivées,
| etc. Stroustrup a décidé de ne pas suivre le nomenclature « membre
| de classe » / « membre d'instance ». Je ne connais pas la raison
| derrière cette décision, mais il ne me gène pas outre-mésure. Dans
| d'autres cas, par exemple quand il a décidé de ne pas utiliser «
| subclass » et « superclass », il a expliqué pourquoi. Mais pas ici,
| ou plutôt, je n'ai jamais vu une explication. Peut-être Gaby en
| connaît une (bien que comme j'ai dit, je ne trouve pas qu'une
| explication soit nécessaire).
J'ai bien lu ta phrase entre parenthèses mais je ne comprends pas très
bien tes deux premières phrases. Comme tu le sais,
C++ emprunte directement à C et Simula.
Simula est le premier langage orienté objet et comme Stroustrup
l'explique régulièrement, « C++ borrows its terminology from Simula
rather than from Smalltalk. » En Simula, une classe est une collection
de fonctions et de données, et je trouve naturel d'appeler les
éléments de cette collection les « membres de cette classe. »
En ce qui concerne la notion de « static » appliqué aux membres d'une
classe, il m'a toujours paru que Stroustrup l'expliquait autrement que
par le circulaire « static en C++ a une définition précise et cela
veut dire exactement ce que la norme C++ veut dire par là. »
Certes, cette assertion n'est pas fausse mais cela ne donne pas une
idée de ce que c'est. Comme, je n'arrive pas à trouver sommeil parce
qu'il fait chaud, je me suis occupé à trouver une référence à
l'explication que Stroustrup donne -- mon examplaire d'ARM est
malheureusement au bureau. Donc du D&E, §13.4, page 288
A static data member of a class is a member for which there is only
one copy rather than one per object. Consequently, a static member
can be accessed without referring to any particular object.
Ici, Stroustrup essaie d'expliquer en des termes simples et généraux
la signification de « static » appliqué aux membres d'une classe.
Il commence par rappeler que « static » appliqué à une donnée membre
veut dire qu'il existe exactement une copie de cette donnée dans tout
le programme, au lieu d'avoir une copie (membre) par objet (ou
instance) de cette classe.
Cette signification est très proche de la signification originelle de
« static » appliquée à une variable locale -- telle que Dennis Ritchie
l'imaginait,
avant qu'il décide un jour de réutiliser ce même mot clé pour dire
qu'une donnée/fonction est locale à une unité de traduction (ce dont
il n'est pas fier, et il l'avoue publiquement).
Il faut bien ici voir la différence avec une variable locale qui
aurait une durée de stockage automatique.
Une telle variable locale est conceptuellement « instanciée » à chaque
appel à la fonction qui la contient ou, en jargon technique, à chaque
activation de la structure de calcul de la fonction. Donc, tout comme
les données membres des objets d'une classe donnée, il existe une
copie par activation. L'utilisation de « static », comme Dennis
Ritchie l'a conçu au départ, c'est pour dire qu'une telle donnée
n'appartient pas à une instance particulière de la fonction, mais à
toutes les instances de la fonction. En somme, la notion de donnée
membre statique telle que Stroustrup l'a conçue est une excellente
généralisation de variable locale statique conçue par Ritchie.
Une fois rappelée cette idée qu'une donnée membre statique est, par
définition, l'idée même qu'il en existe une et une seule copie et
qu'elle n'appartient pas à un objet particulier, Stroustrup poursuit :
A static member function is not associated with any particular
object and need not be called using the special function syntax.
Il me paraît évident que la notion de static appliqué à un membre
d'une classe (que ce soit une donnée ou une fonction) est cohérente.
Il me smeble qu'on l'expliquer en des termes généraux autres que ceux
que la norme C++ utilise, comme Stroustrup le fait, sans en vider la
substance ni la dénaturer.
| Je ne vois pas de problème non plus à utiliser ce vocabulaire ici,
| même
Je ne crois pas que le problème soit l'utilisation du vocabulaire ici,
mais plutôt la question de parler uniquement *de* C++ *en* C++.
| si Stroustrup et la norme ne s'en sert pas. Seulement, il ne faut
| pas
Il me semble que Stroustrup n'hésite pas une seconde à aller au delà
du sous-ensemble très restreint de vocabulaire utilisé par la norme.
Je ne pense pas que la question soit de savoir si le vocabulaire de la
norme C++ est interdit ici. Je crois qu'il est plutôt possible et
utile d'expliquer les concepts de C++ autrement que par le vocabulaire
limité utilisé par la norme.
writes:
| Rien n'empêchait. Et en fait, beaucoup de vocabulaire a été emprunté
| du langage OO -- on parle bien d'héritage, des classes dérivées,
| etc. Stroustrup a décidé de ne pas suivre le nomenclature « membre
| de classe » / « membre d'instance ». Je ne connais pas la raison
| derrière cette décision, mais il ne me gène pas outre-mésure. Dans
| d'autres cas, par exemple quand il a décidé de ne pas utiliser «
| subclass » et « superclass », il a expliqué pourquoi. Mais pas ici,
| ou plutôt, je n'ai jamais vu une explication. Peut-être Gaby en
| connaît une (bien que comme j'ai dit, je ne trouve pas qu'une
| explication soit nécessaire).
J'ai bien lu ta phrase entre parenthèses mais je ne comprends pas très
bien tes deux premières phrases. Comme tu le sais,
C++ emprunte directement à C et Simula.
Simula est le premier langage orienté objet et comme Stroustrup
l'explique régulièrement, « C++ borrows its terminology from Simula
rather than from Smalltalk. » En Simula, une classe est une collection
de fonctions et de données, et je trouve naturel d'appeler les
éléments de cette collection les « membres de cette classe. »
En ce qui concerne la notion de « static » appliqué aux membres d'une
classe, il m'a toujours paru que Stroustrup l'expliquait autrement que
par le circulaire « static en C++ a une définition précise et cela
veut dire exactement ce que la norme C++ veut dire par là. »
Certes, cette assertion n'est pas fausse mais cela ne donne pas une
idée de ce que c'est. Comme, je n'arrive pas à trouver sommeil parce
qu'il fait chaud, je me suis occupé à trouver une référence à
l'explication que Stroustrup donne -- mon examplaire d'ARM est
malheureusement au bureau. Donc du D&E, §13.4, page 288
A static data member of a class is a member for which there is only
one copy rather than one per object. Consequently, a static member
can be accessed without referring to any particular object.
Ici, Stroustrup essaie d'expliquer en des termes simples et généraux
la signification de « static » appliqué aux membres d'une classe.
Il commence par rappeler que « static » appliqué à une donnée membre
veut dire qu'il existe exactement une copie de cette donnée dans tout
le programme, au lieu d'avoir une copie (membre) par objet (ou
instance) de cette classe.
Cette signification est très proche de la signification originelle de
« static » appliquée à une variable locale -- telle que Dennis Ritchie
l'imaginait,
avant qu'il décide un jour de réutiliser ce même mot clé pour dire
qu'une donnée/fonction est locale à une unité de traduction (ce dont
il n'est pas fier, et il l'avoue publiquement).
Il faut bien ici voir la différence avec une variable locale qui
aurait une durée de stockage automatique.
Une telle variable locale est conceptuellement « instanciée » à chaque
appel à la fonction qui la contient ou, en jargon technique, à chaque
activation de la structure de calcul de la fonction. Donc, tout comme
les données membres des objets d'une classe donnée, il existe une
copie par activation. L'utilisation de « static », comme Dennis
Ritchie l'a conçu au départ, c'est pour dire qu'une telle donnée
n'appartient pas à une instance particulière de la fonction, mais à
toutes les instances de la fonction. En somme, la notion de donnée
membre statique telle que Stroustrup l'a conçue est une excellente
généralisation de variable locale statique conçue par Ritchie.
Une fois rappelée cette idée qu'une donnée membre statique est, par
définition, l'idée même qu'il en existe une et une seule copie et
qu'elle n'appartient pas à un objet particulier, Stroustrup poursuit :
A static member function is not associated with any particular
object and need not be called using the special function syntax.
Il me paraît évident que la notion de static appliqué à un membre
d'une classe (que ce soit une donnée ou une fonction) est cohérente.
Il me smeble qu'on l'expliquer en des termes généraux autres que ceux
que la norme C++ utilise, comme Stroustrup le fait, sans en vider la
substance ni la dénaturer.
| Je ne vois pas de problème non plus à utiliser ce vocabulaire ici,
| même
Je ne crois pas que le problème soit l'utilisation du vocabulaire ici,
mais plutôt la question de parler uniquement *de* C++ *en* C++.
| si Stroustrup et la norme ne s'en sert pas. Seulement, il ne faut
| pas
Il me semble que Stroustrup n'hésite pas une seconde à aller au delà
du sous-ensemble très restreint de vocabulaire utilisé par la norme.
Je ne pense pas que la question soit de savoir si le vocabulaire de la
norme C++ est interdit ici. Je crois qu'il est plutôt possible et
utile d'expliquer les concepts de C++ autrement que par le vocabulaire
limité utilisé par la norme.
Rien n'empêchait. Et en fait, beaucoup de vocabulaire a été emprunté
du langage OO -- on parle bien d'héritage, des classes dérivées,
etc. Stroustrup a décidé de ne pas suivre le nomenclature « membre
de classe » / « membre d'instance ». Je ne connais pas la raison
derrière cette décision, mais il ne me gène pas outre-mésure.
Ca dépend par quoi on le remplace ; pour moi "storage class" c'est un
peu mettre l'outil avant l'ouvrage.
A propos de la différence de sens entre class dans "class data member"
et dans "membre de classe" (par opposition à membre d'instance), j'ai
comme l'impression que tout s'éclaire si l'on se souvient que dans
certains langages (pas très populaires, il me semble, hélas), les
classes sont des objets.
Alors, bien sûr, ce n'est pas le cas en C++, donc la classe C++, en
tant que type, est, au fond "static". Autrement dit, le membre
d'instance est instancié avec l'instance-objet, et le membre de classe
(static data member) est instancié avec... la classe ! (*)
Personnellement je trouve ça assez parlant, mais peut-être que les
puristes ou les techniciens de C++ trouveront choquante cette
formulation.
(*) : l'instanciation de la classe C++ n'est certes pas visible depuis le
programme, elle n'est pas accessible, mais elle existe, et la
preuve en est l'existence des static data members qui sont, eux,
accessibles au programme :-) Ceci dit, je concède qu'il s'agit
là d'un point de vue original ;-)
Rien n'empêchait. Et en fait, beaucoup de vocabulaire a été emprunté
du langage OO -- on parle bien d'héritage, des classes dérivées,
etc. Stroustrup a décidé de ne pas suivre le nomenclature « membre
de classe » / « membre d'instance ». Je ne connais pas la raison
derrière cette décision, mais il ne me gène pas outre-mésure.
Ca dépend par quoi on le remplace ; pour moi "storage class" c'est un
peu mettre l'outil avant l'ouvrage.
A propos de la différence de sens entre class dans "class data member"
et dans "membre de classe" (par opposition à membre d'instance), j'ai
comme l'impression que tout s'éclaire si l'on se souvient que dans
certains langages (pas très populaires, il me semble, hélas), les
classes sont des objets.
Alors, bien sûr, ce n'est pas le cas en C++, donc la classe C++, en
tant que type, est, au fond "static". Autrement dit, le membre
d'instance est instancié avec l'instance-objet, et le membre de classe
(static data member) est instancié avec... la classe ! (*)
Personnellement je trouve ça assez parlant, mais peut-être que les
puristes ou les techniciens de C++ trouveront choquante cette
formulation.
(*) : l'instanciation de la classe C++ n'est certes pas visible depuis le
programme, elle n'est pas accessible, mais elle existe, et la
preuve en est l'existence des static data members qui sont, eux,
accessibles au programme :-) Ceci dit, je concède qu'il s'agit
là d'un point de vue original ;-)
Rien n'empêchait. Et en fait, beaucoup de vocabulaire a été emprunté
du langage OO -- on parle bien d'héritage, des classes dérivées,
etc. Stroustrup a décidé de ne pas suivre le nomenclature « membre
de classe » / « membre d'instance ». Je ne connais pas la raison
derrière cette décision, mais il ne me gène pas outre-mésure.
Ca dépend par quoi on le remplace ; pour moi "storage class" c'est un
peu mettre l'outil avant l'ouvrage.
A propos de la différence de sens entre class dans "class data member"
et dans "membre de classe" (par opposition à membre d'instance), j'ai
comme l'impression que tout s'éclaire si l'on se souvient que dans
certains langages (pas très populaires, il me semble, hélas), les
classes sont des objets.
Alors, bien sûr, ce n'est pas le cas en C++, donc la classe C++, en
tant que type, est, au fond "static". Autrement dit, le membre
d'instance est instancié avec l'instance-objet, et le membre de classe
(static data member) est instancié avec... la classe ! (*)
Personnellement je trouve ça assez parlant, mais peut-être que les
puristes ou les techniciens de C++ trouveront choquante cette
formulation.
(*) : l'instanciation de la classe C++ n'est certes pas visible depuis le
programme, elle n'est pas accessible, mais elle existe, et la
preuve en est l'existence des static data members qui sont, eux,
accessibles au programme :-) Ceci dit, je concède qu'il s'agit
là d'un point de vue original ;-)
Ça, j'ai effectivement entendu. Mais ne connaissant rien de
Simula, ça ne me donne qu'une moitié de l'ensemble.
Ça, j'ai effectivement entendu. Mais ne connaissant rien de
Simula, ça ne me donne qu'une moitié de l'ensemble.
Ça, j'ai effectivement entendu. Mais ne connaissant rien de
Simula, ça ne me donne qu'une moitié de l'ensemble.
"Alain Naigeon" writes:
[...]
| A propos de la différence de sens entre class dans "class data member"
| et dans "membre de classe" (par opposition à membre d'instance), j'ai
| comme l'impression que tout s'éclaire si l'on se souvient que dans certains
| langages (pas très populaires, il me semble, hélas), les classes sont des
| objets.
| Alors, bien sûr, ce n'est pas le cas en C++, donc la classe C++, en tant que
| type, est, au fond "static".
Autrement dit, c'est une valeur/objet compile-time, cela ne me choque
pas du tout et je trouve que c'est un point de vue intéressant quand par
exemple, on veut manipuler les types et les templates (qui sont alors
des fonctions vers des types) d'une certaine manière qu'il est convenu
d'appeler, nébuleusement, « méta-programmation. »
"Alain Naigeon" <anaigeon@free.fr> writes:
[...]
| A propos de la différence de sens entre class dans "class data member"
| et dans "membre de classe" (par opposition à membre d'instance), j'ai
| comme l'impression que tout s'éclaire si l'on se souvient que dans certains
| langages (pas très populaires, il me semble, hélas), les classes sont des
| objets.
| Alors, bien sûr, ce n'est pas le cas en C++, donc la classe C++, en tant que
| type, est, au fond "static".
Autrement dit, c'est une valeur/objet compile-time, cela ne me choque
pas du tout et je trouve que c'est un point de vue intéressant quand par
exemple, on veut manipuler les types et les templates (qui sont alors
des fonctions vers des types) d'une certaine manière qu'il est convenu
d'appeler, nébuleusement, « méta-programmation. »
"Alain Naigeon" writes:
[...]
| A propos de la différence de sens entre class dans "class data member"
| et dans "membre de classe" (par opposition à membre d'instance), j'ai
| comme l'impression que tout s'éclaire si l'on se souvient que dans certains
| langages (pas très populaires, il me semble, hélas), les classes sont des
| objets.
| Alors, bien sûr, ce n'est pas le cas en C++, donc la classe C++, en tant que
| type, est, au fond "static".
Autrement dit, c'est une valeur/objet compile-time, cela ne me choque
pas du tout et je trouve que c'est un point de vue intéressant quand par
exemple, on veut manipuler les types et les templates (qui sont alors
des fonctions vers des types) d'une certaine manière qu'il est convenu
d'appeler, nébuleusement, « méta-programmation. »
"Alain Naigeon" wrote in message
news:<40a15338$0$18306$...(*) : l'instanciation de la classe C++ n'est certes pas visible depuis
le
programme, elle n'est pas accessible, mais elle existe, et la
preuve en est l'existence des static data members qui sont, eux,
accessibles au programme :-) Ceci dit, je concède qu'il s'agit
là d'un point de vue original ;-)
Ce ne serait pas un peu circulaire comme raisonnement ? On définit les
membres statiques en termes d'instance de classe, et puis, on s'en sert
pour démontrer l'existance de l'instance.
"Alain Naigeon" <anaigeon@free.fr> wrote in message
news:<40a15338$0$18306$626a14ce@news.free.fr>...
(*) : l'instanciation de la classe C++ n'est certes pas visible depuis
le
programme, elle n'est pas accessible, mais elle existe, et la
preuve en est l'existence des static data members qui sont, eux,
accessibles au programme :-) Ceci dit, je concède qu'il s'agit
là d'un point de vue original ;-)
Ce ne serait pas un peu circulaire comme raisonnement ? On définit les
membres statiques en termes d'instance de classe, et puis, on s'en sert
pour démontrer l'existance de l'instance.
"Alain Naigeon" wrote in message
news:<40a15338$0$18306$...(*) : l'instanciation de la classe C++ n'est certes pas visible depuis
le
programme, elle n'est pas accessible, mais elle existe, et la
preuve en est l'existence des static data members qui sont, eux,
accessibles au programme :-) Ceci dit, je concède qu'il s'agit
là d'un point de vue original ;-)
Ce ne serait pas un peu circulaire comme raisonnement ? On définit les
membres statiques en termes d'instance de classe, et puis, on s'en sert
pour démontrer l'existance de l'instance.