Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

methodes statiques, miam miam !

25 réponses
Avatar
giova
Encore une question de débutant.

Dans une classe, pourquoi ne pas définir toutes les methodes comme etant
statique?

histoire de gagner de l'emplacement mémoire.

une methode statique peut elle etre inline?

10 réponses

1 2 3
Avatar
Alexandre
bonjour,

"giova" a écrit dans le message de
news:40af0dcb$0$21568$
Encore une question de débutant.

Dans une classe, pourquoi ne pas définir toutes les methodes comme etant
statique?


parcequ'une méthode statique ne peut pas accéder aux membres non
statiques...
En gros, une méthode statique et très proche d'une méthode extérieure à la
classe. C'est un membre, certes, mais pas au même sens qu'une méthode "non
statique"


histoire de gagner de l'emplacement mémoire.


Pas de changement. A peu de choses près, une méthode occupe le même espace
mémoire, qu'elle soit membre normal, membre statique ou globale.


une methode statique peut elle etre inline?


Oui.

Avatar
Horst Kraemer
On Sat, 22 May 2004 10:23:08 +0200, giova wrote:

Encore une question de débutant.

Dans une classe, pourquoi ne pas définir toutes les methodes comme etant
statique?

histoire de gagner de l'emplacement mémoire.


Quel emplacement de mémoire gagnerait-on ?

--
Horst

Avatar
Gabriel Dos Reis
giova writes:

[...]

| emplacement mémoire meme si aucun objet n'a été créé. ca veut aussi
| dire que quelque soit le nombre d'objet la fonction statique ne sera
| "allouée" qu'une seule fois. Donc gain de place.

Pourquoi cela n'en serait pas de même pour les fonction membres
non-statiques ?

-- Gaby
Avatar
giova
Alexandre wrote:

bonjour,

"giova" a écrit dans le message de
news:40af0dcb$0$21568$

Encore une question de débutant.

Dans une classe, pourquoi ne pas définir toutes les methodes comme etant
statique?



parcequ'une méthode statique ne peut pas accéder aux membres non
statiques...
En gros, une méthode statique et très proche d'une méthode extérieure à la
classe. C'est un membre, certes, mais pas au même sens qu'une méthode "non
statique"


histoire de gagner de l'emplacement mémoire.



Pas de changement. A peu de choses près, une méthode occupe le même espace
mémoire, qu'elle soit membre normal, membre statique ou globale.


une methode statique peut elle etre inline?



Oui.


ok merci pour toutes ces precisions, je vais chercher plus d'infos sur

les methodes statiques, car si l'on ne peut y traiter que des attribut
statiques, le champ d'application doit etre vraiment limité et
specifiques a quelques cas.


Avatar
giova
Horst Kraemer wrote:

On Sat, 22 May 2004 10:23:08 +0200, giova wrote:


Encore une question de débutant.

Dans une classe, pourquoi ne pas définir toutes les methodes comme etant
statique?

histoire de gagner de l'emplacement mémoire.



Quel emplacement de mémoire gagnerait-on ?

alors la il faut que quelqu'un me corrige car je risque de dire une

connerie.

qui dit statique dit appartient a la classe et non a l'objet. cad que
sitot la classe défini la methode statique se voit alloué son
emplacement mémoire meme si aucun objet n'a été créé. ca veut aussi dire
que quelque soit le nombre d'objet la fonction statique ne sera
"allouée" qu'une seule fois. Donc gain de place.


Avatar
Anthony Fleury
giova wrote:

alors la il faut que quelqu'un me corrige car je risque de dire une
connerie.

qui dit statique dit appartient a la classe et non a l'objet. cad que
sitot la classe défini la methode statique se voit alloué son
emplacement mémoire meme si aucun objet n'a été créé. ca veut aussi dire
que quelque soit le nombre d'objet la fonction statique ne sera
"allouée" qu'une seule fois. Donc gain de place.


En fait, penses tu que pour une méthode non static le code de la méthode
membre sera dupliqué et existera pour chaque objet ?
Si c'est le cas c'est faux. Une méthode membre non static et une méthode
static se distinguent par une chose : l'une connait le pointeur this de la
classe, l'autre non. Dans les deux cas, le code de la fonction n'est
présent qu'une fois dans l'executable, et un appel de fonction normal se
fait. Mais dans le cas d'une fonction non statique, il y a une notion
d'appartenance à une instance de la classe donnée par this, qui fait que
l'on peut acceder à des variables dépendantes de l'instance en cours. (tout
ceci n'est valable que pour les méthode non inline, dans le cas contraire
il n'y a même pas présence du code dans l'executable...).

Une méthode static ne connaissant pas this, elle ne peut pas acceder à des
membres dépendant d'une instance de la classe, donc elle n'a accès à aucun
membre non static.
Si toutes les méthode étaient statiques, il n'y aurait plus de variables
dépendant de l'instance, et en clair on ne pourrait avoir qu'un seul objet
d'un même type, on ne pourrait rien faire...

Anthony
--
"You could be my unintended, choice to live my life extended
You should be the one I'll always love, I'll be there as soon as I can
But I'm busy mending broken pieces of the life I had before"
(C) Muse - Unintended

Avatar
Alain Naigeon
"giova" a écrit dans le message news:
40af4d01$0$12751$

ok merci pour toutes ces precisions, je vais chercher plus d'infos sur
les methodes statiques, car si l'on ne peut y traiter que des attribut
statiques, le champ d'application doit etre vraiment limité et
specifiques a quelques cas.


Ben... c'est pas si rare : à chaque fois que quelque chose
(donnée ou fonction) est identique pour toute la classe,
c'est à dire commun à tous les objets de cette classe qui
seront créés, tu peux envisager "static".

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
Gabriel Dos Reis
Anthony Fleury writes:

| Une méthode static ne connaissant pas this, elle ne peut pas acceder à des
| membres dépendant d'une instance de la classe, donc elle n'a accès à aucun
| membre non static.

Ce n'est pas exactement ça. Une fonction membre statique a les mêmes
droit d'accès que les autres fonctions membres (non-statiques),
seulement elle ne peut pas faire cet accès par this -- parce que ce
dernier n'y existe pas. Elle peut parfaitement trifouiller les membres
d'un paramètre dont le type est la classe à laquelle elle appartient.


-- Gaby
Avatar
Anthony Fleury
Gabriel Dos Reis wrote:

Anthony Fleury writes:

| Une méthode static ne connaissant pas this, elle ne peut pas acceder à
| des membres dépendant d'une instance de la classe, donc elle n'a accès à
| aucun membre non static.

Ce n'est pas exactement ça. Une fonction membre statique a les mêmes
droit d'accès que les autres fonctions membres (non-statiques),
seulement elle ne peut pas faire cet accès par this -- parce que ce
dernier n'y existe pas. Elle peut parfaitement trifouiller les membres
d'un paramètre dont le type est la classe à laquelle elle appartient.


Merci de la précision, vu que je ne l'utilise jamais, je n'y pense pas.
Vient alors ma question :

class foo {
int x;
public:
static int X(foo& f) { return f.x; }
};

Ceci est légal, mais est ce que ca a un intêret ?
Quel pourrait être l'intêret de passer un paramètre du type de la classe qui
contient la fonction statique pour en récupérer un membre privé ?

Je demande ca car les seules fois où j'ai écrit le mot static dans une
classe, je me referais à des membres static uniquement et gardais cette
idée : "Un membre static est indépendant de toute instanciation de la
classe"

Anthony
--
"You could be my unintended, choice to live my life extended
You should be the one I'll always love, I'll be there as soon as I can
But I'm busy mending broken pieces of the life I had before"
(C) Muse - Unintended

Avatar
Fabien LE LEZ
On Sun, 23 May 2004 10:39:05 +0200, Anthony Fleury
wrote:

class foo {
int x;
public:
static int X(foo& f) { return f.x; }
};

Ceci est légal, mais est ce que ca a un intêret ?


Sous la forme suivante, je m'en sers assez souvent :

class foo
{
public:
void LanceFonctionAvecCallback()
{ fct_avec_callback (this, static_f, autres_parametres); }
private:
static void static_f (foo *ptr) { ptr-> f(); }
void f();
};

Généralement, quand tu as un système de callback, tu peux passer un
pointeur (ici, this) et un pointeur sur une fonction callback. Ce
pointeur sur fonction ne peut pas être un pointeur sur une fonction
membre "normale", ça ne peut être qu'une fonction static ou libre.

--
;-)
FLL, Epagneul Breton

1 2 3