J'apprends à propos de C ++ et de programmation orientée objet. Passez un petit doute -
class CA { void fun() { int x; } }; class CB { int y; }; int main() { CA obj; CB obj1; cout<<sizeof(obj)<<'\t'<<sizeof(obj1); }
4 Réponses :
La taille de ca code> n'a pas de variables de membre. (Une fonction virtuelle code>
tel que
amusant code> et tout ce qui pourrait contenir ne contribue pas à la taille d'une instance d'une classe.) Mais
Tailleof (CA) code> ne peut pas être zéro car sinon le pointeur arithmétique briserait horriblement sur un tableau de
ca code> objets! Donc, votre compilateur choisit une valeur minimale. 1 est autorisé car ce n'est pas plus petit que
Tailleof (Char) Code>. P>
cb code> est borné par la taille d'un
int code>; Cela pourrait être supérieur à celui dû à le rembourrage em>. p>
Il n'y a aucune raison de garnir la classe ayant un seul int.
@Sergeya: dit qui? Methinks MSVC peut commencer à le faire sous Windows sous forme de bus x64 Evoluer et ils collent avec un int code> pour la compatibilité en arrière!
Pas sûr de suivre. Pouvez-vous s'il vous plaît élaborer pourquoi 32 bits intves devront être rembourrés lorsqu'ils sont à l'intérieur d'une classe? Apparemment, ils travailleraient bien avec ces bus évolués quand ils sont seuls? Quelle différence la classe ferait-elle la classe?
@ Sergeyya: Je n'ai plus accès à un tel compilateur, mais je pense i> l'un des compilateurs de Borland avec un int code> IT dans un
struct code>. Quoi qu'il en soit, mon point reste, il pourrait I> encore plus grand.
Borland Quoi? : D Je n'ai jamais eu de bonne opinion sur leur logiciel, c'est pourquoi nous avions l'habitude de les appeler des punaises. Leurs optimiseurs m'ont frappé une ou deux fois, si je me souviens bien.
Vous pouvez utiliser CB pour stocker une valeur. C'est pourquoi les objets de cette classe ont une taille supplémentaire.
CA a; a ... // what would you put there ?
Bit trompeur avec la "pile". CB CODE> La variable de membre 'S peut être "sur la pile". Préfère la terminologie C ++.
Tu es absolument juste. Pouvez-vous suggérer une modification, car la terminologie n'est pas ma forte.
Hmm, lutte pour trouver une solution rapide à cette phrase tbh.
La variable n'est pas un membre de données de la classe. C'est une variable locale de la fonction qui n'est pas vivante en dehors de la fonction. La classe n'a pas de membres de données. p> La taille d'un objet complet (ou de classe) ne peut pas être égal à 0. Donc, le compilateur le définit à 1. p> dans le second cas, la variable fais attention à cela si dans le second cas, vous déclarerez un élément de données statique au lieu de l'élément non statique comme < / p> puis l'élément statique ne constitue pas la taille de la classe ou un objet de la classe. Les membres statiques de données sont définis (généralement) en dehors des classes. Au sein de la classe, une déclaration du membre statique n'est pas sa définition. Encore une fois, le programme produira x code> à l'intérieur de la fonction
y < / code> est un élément de données de la classe p>
1 code> pour un objet d'une telle classe. P> p>
Notez que statique int x code> dans
amusant code> ne compte pas non plus, malgré l'être, dans un sens vivant en dehors de la fonction. Vous êtes normalement plus complet que ce vlad!
@Bathsheba C'est en tout cas une variable locale de la fonction.
@Bathsheba Vous avez fait exactement la même chose dans votre propre réponse.
class CA { void fun() { int x; } };
"Les deux classes ont des entiers" - non, ils ne le font pas. La fonction amusante () a un entier, créé chaque fois que la fonction est appelée, mais cela ne fait pas partie de la classe.
x code> ne fait pas partie de
ca code>. Il n'existe pas, sauf lorsque vous exécutez
amusant code>, il n'a pas de stockage en dehors de ce contexte.
Je vous suggère de lire un bon livre sur C ++. La liste commune peut être trouvée ici:
@Sergeya. Pourrait être une réponse en stock pour toute question sur la pile débordement: je vous suggère de lire un bon livre sur [Tag].
@Bathsheba pas vraiment. Mais lorsque la question est très large et basique, il est difficile de ne pas voir que l'OP manque de concepts fondamentaux de la langue qui serait difficile à expliquer au format de dépassement de pile. En particulier la différence entre les membres de la classe de classe et les variables locales d'une fonction.
@Sergeya: Celui-ci transmet mon seuil de décence - le fait que la taille minimale est 1 est enterrée assez profonde.
@Bathsheba J'accepterais certainement la question de pourquoi la taille de la classe avec aucun membre n'est 1 (pas 0) i> (évidente d'un duplicata). Mais dans ce cas, OP ne parvient pas à voir la différence entre les membres de données et la variable de fonction locale ... sur un tarif, nous pourrions avoir une différence d'opinions ici.
@Sergeya: Oui, nous ferions probablement mieux de partir là-bas; Je vais ouvrir une bouteille de Malbec. Passez une bonne soirée!
@Bathsheba accueille!