La classe
Il y a quelque temps, j'ai lu un commentaire critiquant l'organisation des classes en C++, parce qu'elles regroupent aussi bien des données que les fonctions s'y rapportant (les méthodes). Celui qui l'avait écrit ne jurait que par Ada et selon lui les sous-programmes n'avaient pas a êtres déclarés à cet endroit (ce qui se rapproche le plus en Ada 95 d'une classe dérivable est appelé tagged record : un regroupement de données qui peut être étendu, plusieurs fois si nécessaire, les sous-programmes spécifiques à cet enregistrement étant simplement définis dans le même paquetage et appelés opérations primitives).
En fait, il y a là une confusion entre les notions de structure (struct {}) et de classe (class {}) en C++. Une structure n'est normalement qu'un enregistrement ordinaire incluant des données diverses et par défaut celles-ci sont publiques (visibles de l'extérieur). Les classes sont une généralisation du concept de types de données et les informations qu'elles contiennent sont habituellement privées (invisibles, elles doivent être manipulées par les sous-programmes publics qui constituent une interface, par sécurité). Il est vrai que les structures et les classes se ressemblent fortement et que le développeur à en C++ le loisir de faire un peu n'importe quoi, par exemple en créant une classe où tout est public (ce dernier point est effectivement critiquable s'il manque d'expérience).
Un type de données définit à la fois la façon dont les informations sont codées en mémoire et les différentes opérations qui peuvent leur être appliquées : au niveau de la machine, une addition sur 2 entiers n'est pas du tout la même opération que celle sur 2 nombres en virgule flottante. En tant que généralisation des types, il est parfaitement logique que les classes incluent aussi les sous-programmes. En réalité il s'agit uniquement de leurs déclarations, utilisées abondamment pendant les compilations, car le code proprement dit n'a aucune raison d'être dupliqué dans l'exécutable pour chaque nouvel objet. Même pour les fonctions virtuelles, le surplus de "mécanique" nécessaire est minimum. Il est tout de même vrai que comme la plupart des méthodes d'une classe travaillent implicitement sur ses propres données - par l'intermédiaire d'un pointeur vers l'objet appelé this - les choses risquent de se compliquer si l'on veut s'assurer que 2 opérandes de types différents d'une opération peuvent être permutés. Mais c'est une autre histoire.