9
votes

Fonctions de classe en ligne qui ont des membres de données privés

Maintenant, j'apprends des fonctions en ligne et j'ai rencontré quelque chose qui m'a vraiment rendu confus

voir cette classe xxx

Il a un membre de données privé: INT x;

et il a deux fonctions en ligne publiques: SET (int-y) et impression ()

Désormais, car deux fonctions sont en ligne, lorsqu'elles sont appelées, le compilateur remplace l'appel de fonction avec le contenu de la fonction.

donc si je le fais xxx

Étant donné que les deux fonctions sont en ligne, cela devrait être l'équivalent de ceci: xxx

mais attendez une seconde, x est privé . Par conséquent, cela ne devrait pas fonctionner.

mais cela fait et je suis confus pourquoi cela fonctionne bien que nous ne pouvons normalement pas accéder aux membres privés de l'extérieur de la classe?

Peut-on expliquer à Soyez pour la raison pour laquelle vous pouvez accéder aux membres de données privés de l'extérieur de la classe, mais lorsqu'une fonction de membre est en ligne, elle peut bien que Inline remplace simplement l'appel de la fonction avec le contenu de la fonction?


1 commentaires

L'inlinisation ne fait que faire n.x = 1; . Votre hypothèse est fausse.


4 Réponses :


6
votes

Vous avez mal compris à quel point fonctionne l'inline. Le compilateur augmente la logique du code, pas le texte du code.

Peut-on expliquer que vous pouvez expliquer pourquoi vous pouvez accéder aux membres de données privés de l'extérieur de la classe, mais lorsqu'une fonction de membre est en ligne, il peut simplement remplacer l'appel de fonction avec le contenu de la fonction?

Parce que le contenu de la fonction est le contenu de la fonction . Ils n'arrêtent pas d'être la fonction juste parce qu'ils ont été inlinés. Vous êtes autorisé à accéder aux variables des membres privés de l'intérieur d'une fonction membre. Lorsqu'une fonction de membre est inline, son code est toujours à l'intérieur de la fonction membre car la fonction est inline.


2 commentaires

Hmm .. ce genre de genre explique-le merci. Je suppose que l'explication dans mon livre n'est pas assez claire


Ce n'est pas le contenu de la fonction qui sont inline mais la signification de la fonction. (C'est-à-dire son comportement.)



2
votes

Tout d'abord, que ce soit ou non est inliné, c'est jusqu'à ce compilateur. Dans beaucoup de cas, cela décidera n'est pas la meilleure chose à faire.

Deuxièmement, dans le cas où il le ferait en ligne, il le fait avec un binaire compilé, produit du comportement décrit dans le code source C ++, pas le texte réel.


0 commentaires

11
votes

La protection des membres de données est purement conceptuelle . Il n'existe que au niveau du compilateur. Il est vérifié et appliqué lorsque le compilateur traduit le code source. Une fois que le code est compilé, il n'y a plus de différence entre les membres publics et les données privés, c'est-à-dire que, il n'y a pas de mécanismes physiques qui appliqueraient le contrôle d'accès et empêcheraient l'accès aux membres de données privés.

L'accès membre est appliqué par le compilateur conformément à la spécification de la langue. La spécification linguistique indique que les fonctions de membre de la classe (peu importe si elles sont en ligne ou non) ont accès aux membres privés de la classe. Donc, le compilateur permet cet accès. Pendant ce temps, d'autres fonctions sont interdites un tel accès, de sorte que le compilateur se plaint à ce sujet.

Dans votre exemple, vous accédez à un membre de données privé à partir d'une fonction membre. Cela est permis, donc le code compile, c'est-à-dire que le compilateur ne se plaint pas. Que se passe-t-il plus tard dans le code de la machine généré, après l'inlinité de la fonction, est complètement non pertinent. C'est tout ce qu'il y a.


4 commentaires

Avez-vous une référence pour prouver ce que vous dites?


@ Mohamed Ahmed Nabil: C'est comme me demander une référence que 2 + 2 = 4. D'une part, bien sûr, j'ai une référence: la spécification de la langue ou pratiquement n'importe quel livre de base sur C ++. D'autre part, il est très essentiel qu'il soit difficile de commencer à choisir la meilleure référence dans ce cas. Pense juste à moi comme cette référence :)


@MOHAMEDAHMEDNABLABILLABLABILLABL: Vous pouvez vous convaincre par l'entrelacement privé , protégé et public membres de données et en regardant leurs adresses. Vous pouvez vous convaincre en retournant des pointeurs sur des membres de données privés des fonctions, puis de les manipuler à travers ces pointeurs.


Pour ajouter, il n'est pas obligatoire pour un compilateur de signaler une fonction si le mot-clé "Inline" est présent dans la signature.



0
votes

morbo dit que le mot clé en ligne ne fonctionne pas de cette façon.

Morbo dit que le mot-clé en ligne indique que le conflit de symboles sur le temps de liaison impliquant cette fonction devrait être ignoré et que toutes les fonctions dont la mise en œuvre se trouve dans la déclaration de la classe sont implicitement en ligne.

morbo est sage. Vous devriez écouter Morbo, même s'il y a une signification complémentaire technique technique mineure d'en ligne qui implique de prendre des adresses.

Plus sérieusement, Inline vous permet de mettre en place des définitions de la mise en œuvre dans un fichier d'en-tête. En réalité, le code en ligne est donc plus facile, car il ne doit pas se produire au temps de liaison (et la plupart des lieurs C ++ sont trop paresseux), mais cela ne provoque pas que le code soit en ligne.

Et enfin la confidentialité est conceptuel, il n'est pas appliqué par le temps d'exécution C ++. C'est juste appliqué à la compilation en vous disant que quelque chose est hors limites.


2 commentaires

Bonjour, morbo. Comment va la famille?


Morbo dit belligérant et nombreux.