J'ai une programmation orientée objet avec cours c ++ ce semestre à l'université et nous apprenions les fonctions des amis.
Je les déteste instinctivement pour leur capacité à contourner la sécurité offerte par l'encapsulation et le masquage des données, j'ai lu quelques articles sur Internet et certaines personnes ont pensé que c'était une bonne idée avec des utilisations légitimes.
Que dirait un expert OOPs des fonctions d'ami en C ++? Dois-je simplement le parcourir ou devrais-je en savoir plus?
c++
object-oriented
friends
nikhil
la source
la source
Réponses:
Il n'est pas toujours commode de faire toutes les fonctions liées à une classe C ++ membres de cette classe. Par exemple, imaginez une implémentation d'algèbre vectorielle avec multiplication scalaire. Nous voulons écrire:
Nous pouvons le faire avec une fonction membre:
Mais nous aimerions également écrire:
Cela nécessite une fonction gratuite:
Le
friend
mot clé a été ajouté à C ++ pour prendre en charge cette utilisation. La fonction free fait partie de l'implémentation de la classe Vector et doit être déclarée dans le même en-tête et implémentée dans le même fichier source.De même, nous pouvons utiliser
friend
pour simplifier l'implémentation de classes étroitement couplées, comme une collection et un itérateur. Encore une fois, je déclarerais les deux classes dans le même en-tête et les implémenterais dans le même fichier source.la source
inline Vector operator*(double a, Vector v) { return v*a; }
. Solution canonique en fait.inline Vector operator*(double a, Vector v) { return -v*a; }
et cela ne nécessite toujours pas d'amitié.Les fonctions ami ne sont pas différentes des fonctions membres en termes d'encapsulation. Ils peuvent cependant offrir d'autres avantages, comme être plus génériques, en particulier en ce qui concerne les modèles. De plus, certains opérateurs ne peuvent être spécifiés que comme fonctions libres, donc si vous voulez qu'ils aient un accès membre, vous devez
friend
.Il vaut mieux pour
friend
une seule fonction que d'être forcé de faire quelque chose que vous ne voulez pas rendre public. Cela signifie que le monde entier peut l'utiliser - au lieu d'une seule fonction.la source
friend
une fonction qui est également "privée", telle qu'elle n'est déclarée que dans un seul TU.Si vous êtes passionné par ce que vous faites, vous apprenez tout sur le C ++. Découvrez à quoi ils servent, comment les utiliser, puis - et alors seulement - décidez de ne pas les utiliser. À tout le moins, vous serez prêt à lire le code de quelqu'un d'autre qui utilise cette facette de C ++.
la source
" Que dirait un expert OOPs ... " Cela dépend surtout de son expertise en C ++, qui - selon ses propres spécifications - n'est pas (et ne veut pas être) un langage pour puriste.
Les fanatiques de POO n'utilisent pas C ++ (ils préfèrent Smalltalk et comme Java).
Les zelots de programmation fonctionnelle n'utilisent pas C ++ (ils préfèrent LISP et ses successeurs)
La plupart des experts OOP n'aiment pas la fonction ami simplement parce qu'ils veulent que la partie OOP de C ++ se comporte comme Smalltalk. Mais C ++ n'est pas Smalltalk, et ils ne peuvent même pas comprendre que friend ne rompt pas l'encapsulation , pour la raison très simple qu'une fonction ne peut pas être amie de votre classe sans que votre classe le veuille .
Et du point de vue "fonctionnalité", entre
a.fn(b)
etfn(a,b)
il n'y a pas de différence (oùfn
est un ami): les parties impliquées sont les mêmes. Simplement, une syntaxe peut être plus appropriée qu'une autre: si fn est commutatif en ce qui concernea
etb
,fn(a,b)
est probablement plus approprié alorsa.fn(b)
(où un semble avoir un "rôle spécial" que, en fait, il ne l'est pas.)la source
la source
La FAQ C ++ est succincte:
La FAQ présente l'une des façons les plus utiles de penser à l'amitié:
L'utilisation la plus courante des fonctions ami est peut-être la surcharge << pour les E / S.
la source
Les fonctions Friend sont mieux utilisées pour les définitions d'opérateur définies par l'utilisateur. Ils sont utiles dans d'autres situations, mais si vous vous retrouvez à spécifier fréquemment des classes d'amis, vous pouvez être sur un détour par la conception (juste une bonne auto-vérification à utiliser lors de l'écriture de code).
Faites attention à la déclaration de «sécurité» dans la question d'origine. Les modificateurs d'accès sont là pour vous empêcher d'écrire du mauvais code en cas d'accident, tout comme le compilateur en quelque sorte. Les modificateurs d'accès limitent l'interface et servent à communiquer quelles fonctions sont importantes pour utiliser la classe (publiques et protégées), et lesquelles ont été créées dans le but de rendre la classe plus jolie pour les mainteneurs (privées). Les modificateurs ne constituent pas une sécurité dans la mesure où il existe de nombreuses façons d'accéder aux données privées. Par exemple, obtenez un pointeur sur la classe et sa taille et allez à la pêche.
la source
Les fonctions d'ami C ++ sont étroitement liées aux fonctionnalités suivantes:
Cela signifie qu'ils n'ont pas ce pointeur et sont donc en dehors de la classe / objet. En revanche, ils prennent souvent des paramètres qui les font à nouveau appartenir à la classe. Voici un exemple qui clarifie le lien:
La seule différence entre les fonctions statiques et les fonctions ami est qu'une fonction ami peut utiliser plusieurs classes.
L'utilisation du mécanisme ami en c ++ nécessite des programmeurs qui ont environ 10 à 15 ans d'expérience avec la méthode de programmation c ++, et donc vous devriez d'abord l'éviter. C'est une fonctionnalité avancée.
la source