Ce que signifie le modificateur const après une déclaration de méthode - page 5

 
Alexey Kozitsyn:
Ce qui est appelé ici, c'est que si l'objet1 de la classe A appelle une méthode constante de la classe A, alors cette méthode ne peut pas changer cet objet1 (c'est-à-dire l'objet1 qui l'a appelé). Cependant, si l'objet 1 est passé par référence à la même méthode constante, mais appelée depuis l'objet 2 de la classe A, alors l'objet 1 peut être modifié. L'objet 2, quant à lui, ne peut pas.

Comment un objet peut-il appeler une méthode ? Une méthode peut être appelée depuis une fonction ou depuis une autre méthode.

Ce n'est pas seulement une méthode de classe qui est appelée, mais une méthode d'un objet spécifique. La classe elle-même est une abstraction.

 
Dmitry Fedoseev:

Comment un objet peut-il appeler une méthode ? Une méthode peut être appelée depuis une fonction ou depuis une autre méthode.

Ce n'est pas seulement une méthode de classe qui est appelée, mais une méthode d'un objet spécifique. La classe elle-même est une abstraction.

C'est ce qui est si trivial. Et un enregistrement du type

obj.method();

Comment ça s'appelle ?

Vous l'écrivez vous-même :

Ce n'est pas seulement une méthode de classe qui est appelée, mais une méthode d'un objet spécifique.

On peut aussi dire que c'est acceptable :

method();

Qu'est-ce que la méthode appelle ?

C'est-à-dire, quelle méthode est appelée par ?

 
@Alexey Kozitsyn:

C'est une question difficile. Et une entrée comme...

Comment appelez-vous cela ?

Vous l'écrivez vous-même :

Vous me dites que c'est autorisé :

Quel est le nom de la méthode ?

C'est-à-dire, quelle est la méthode utilisée pour l'appeler ?

Regardez la situation. C'est vous qui avez des problèmes, pas moi. L'exemple d'Alexey vous semble incorrect, alors qu'il est tout à fait clair et compréhensible pour moi.

--

"Une entrée de type" est appelée un appel à la méthode "method" de l'objet "obj".

--

"Vous me direz aussi qu'un tel enregistrement est admissible" - l'impression est que c'est vous qui écrivez sur une telle chose.

---

La méthode n'appelle rien. La méthode est appelée.

 
Dmitry Fedoseev:

Regardez la situation. C'est vous, pas moi, qui êtes confus. L'exemple d'Alexei vous semble incorrect, alors qu'il me semble suffisamment clair et compréhensible, il ne m'a pas posé de questions, mais m'a seulement permis de comprendre.

--

"Une entrée de type" est appelée un appel à la méthode "method" de l'objet "obj".

--

"Vous me direz aussi qu'un tel enregistrement est admissible" - l'impression est que c'est vous qui écrivez sur une telle chose.

---

La méthode n'appelle rien. La méthode est appelée.

L'exemple d'Alexei est acceptable, mais il ne devrait pas, à mon avis personnel, servir d'exemple aux autres.

Vous voyez, vous n'avez toujours pas répondu à ma question : qu'est-ce qui initie un appel de méthode d'une classe (ou autrement, qu'est-ce qui invoque une méthode (pas ce qui est invoqué par une méthode, mais ce qui/qui invoque la méthode elle-même)) ?

N'importe quelle méthode. C'est une question simple, vous avez écrit un article pour les débutants sur la POO.

Une méthode n'appelle rien. La méthode est appelée.

Alors comment s'appelle-t-il ?
 
Alexey Kozitsyn:

1. L'exemple d'Alexei est acceptable, mais il ne devrait pas, à mon avis personnel, servir d'exemple aux autres.

2. Vous voyez, vous n'avez toujours pas répondu à ma question : qu'est-ce qui initialise un appel de méthode de classe (ou autrement, qu'est-ce qui invoque une méthode (pas ce qui est invoqué via une méthode, mais ce qui/qui invoque la méthode elle-même)) ?

3. toute méthode. C'est une question simple, vous avez écrit un article pour les débutants sur la POO.

1. Suggérez votre propre exemple.

2. Pas de réponse. Parce que je ne sais pas de quoi on parle.

3. Je ne sais pas non plus de quoi on parle.

 
void fun(){
   obj.method();
}
La méthode "method" de l'objet "obj" est appelée par la fonction "fun".
 
Dmitry Fedoseev:

1. Proposez votre propre exemple.

2. Pas de réponse. Parce que je ne sais pas de quoi on parle.

3. Je ne sais pas non plus de quoi on parle.

2. La discussion porte sur ce qui appelle la méthode de la classe (et non la méthode statique). La méthode de la classe est appelée par l'objet de la classe ou sinon, l'objet de la classe initie l'appel de la méthode de la classe, par exemple this :

obj.method();   // obj - объект класса А, method() - метод класса А

Si la méthode est constante, elle ne peut pas modifier l'objet par lequel elle a été appelée, c'est-à-dire l'objet obj. Un objet (par exemple obj2) qui lui est passé, d'autre part :

obj.method( obj2 );

peut être modifié s'il est passé par référence sans modificateur const. C'est tout.

Au départ, je n'ai pas compris les déclarations des "corefeys" du forum :

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Que signifie le modificateur const après une déclaration de méthode

Combinator, 2016.01.31 20:32

En C++, cela signifie que la méthode ne peut pas modifier les membres de la classe, à l'exception des membres déclarés mutables.

Puisque dans MQL vous ne pouvez pas obtenir une telle chose, cela signifie que la méthode ne peut pas changer l'objet en principe.

Ou

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégie

Que signifie le modificateur const après la déclaration de la méthode ?

Vasiliy Sokolov, 2016.02.01 11:55

Une méthode constante est un autre exemple du proverbe "nous avons essayé de faire mieux, mais il s'est avéré que c'était toujours la même chose". Je pense que c'est une devise pour le C++ tout court. Il n'y a pas d'utilité pratique, mais cela complique considérablement la conception des programmes OOP, parce que vous devez constamment contrôler le type d'objet modifié (il doit aussi être constant).

ou

Eh bien, pourquoi ne peut-elle pas le faire ? Tout change parfaitement bien. Et la formulation elle-même est incorrecte : une méthode constante ne peut pas modifier les membres d'une instance de sa classe.

 
Vasiliy Sokolov:

Je ne le nie pas. Sharpe est en effet une langue parfaite, grande et belle.

OK, disons que tu peux toujours t'en tirer à bon compte. Mais vous feriez mieux d'expliquer brièvement avec un exemple, ce qui donne const ? Quelle est sa véritable utilité ? Par exemple, et de préférence pas écrit de toutes pièces.

C'est une chose lorsque vous écrivez un projet pour vous-même et que l'ensemble du projet est composé de milliers - dizaines de milliers de chaînes de caractères. C'est autre chose quand vous donnez un projet de plusieurs millions de lignes à un client et qu'un Hindu Harikrishna est assis là sans aucune idée. J'ai travaillé avec des hindous de Bangalore, et le niveau était en fait inférieur à celui de nos gars.

C'est comme là-bas : ils suivent une formation de programmeur et emmènent le reste de leurs proches au travail, et ils ne savent peut-être rien du tout. Ce sont des gitans.

Et si le code critique est emballé dans une libu, il y a moins de chance de corruption. C'est ce que je pense.

 
Alexey Kozitsyn:

...

Pourquoi pas ? ! Tout peut être modifié sans problème. Et la formulation elle-même est incorrecte : une méthode constante ne peut pas modifier les membres d'une instance de sa classe.

C'est ce que je veux dire, car nous ne parlons pas du type dans ce contexte. Une "classe propre" est évidemment sa propre instance (c'est-à-dire un objet).

 void bar(X& obj) const 
    {
        obj._x = 42; // Здесь меняем члена не своего класса OK! obj передается по ссылке и не имеет модификатора const
        _x = 42; // Попытка изменить члена своего класса ERROR!
    }

Le membre_x appartient à la même classe que la méthode bar.

C obj._x - ici le membre _x est dans une classe étrangère obj.

Il me semble acceptable de parler d'une classe plutôt que d'une instance, car il est évident que _x appartient à notre classe, que nous écrivons, et obj.x à la classe étrangère, que nous gérons.

En parlant de terminologie OOP, toute la terminologie ici est un peu de cela (ou même beaucoup).

 

Personnellement, j'ai toujours compris les méthodes constantes comme des méthodes qui ne peuvent pas modifier les variables de classe.

Je les ai très rarement utilisés, car j'ai souvent rencontré une situation où la redéfinition d'une méthode nécessite de changer quelque chose, alors que la méthode de base est constante (cela a déjà été mentionné ici).

Les méthodes statiques sont largement utilisées. Dans presque toutes les classes complexes. Il s'agit généralement de méthodes supplémentaires "de service" qui ne nécessitent pas d'accès aux variables de la classe.

De plus, pour les constantes comme "nombre de secondes dans un jour", j'essaie d'utiliser un const statique, plutôt que #define. Dans ce cas, la déclaration et l'initialisation d'une telle constante se trouvent à des endroits différents, mais le contrôle de type a lieu et il m'a dépanné plus d'une fois.

Raison: