Je viens de Java et je tente d'apprendre C ++.
Autant que je puisse dire, l'utilisation des pointeurs est très similaire à la manière dont les variables de référence fonctionnent en Java, en ce que vous passez une adresse mémoire à la valeur. J'ai donc l'impression d'avoir une très bonne compréhension d'eux. Je comprends aussi que ces variables sont stockées sur le tas. P>
Cependant, je vois qu'il existe une autre manière dans laquelle vous pouvez déclarer des variables en C ++, sans que le nouvel opérateur / pointeurs faisait simplement quelque chose comme: p> qui créera une valeur d'employé avec "Frank" comme paramètre. Ces variables sont stockées sur la pile. P> Donc, vous avez donc ces 2 façons différentes de créer des variables et à la fois avec leur propre comportement unique (avec une gestion de la mémoire aussi?). P> Ma question est que, quand est-il approprié d'utiliser des pointeurs VS valeurs? Quelle est la meilleure pratique? Comment devrais-je savoir de quelle manière je veux déclarer mes variables la plupart du temps? P> p>
7 Réponses :
Deux bêtes différentes: Si vous attribuez par pointeur, vous retrouvez des relations N-T-1 que vous devez gérer grâce à une gestion appropriée des ressources. Ceci est normalement pris en charge dans Java. P>
Dans ce que vous appelez "Objets de référence", vous obtenez différents objets (qui doivent être suivis, etc.). P>
Comment appelez-vous des "objets de référence", donc je connais la terminologie appropriée? Je ne savais pas que je viens de faire quelque chose.
Il y a deux problèmes différents en jeu ici: créer des objets et se référant à eux.
Il existe deux endroits que des objets sont créés: la pile et le tas. Si vous utilisez la syntaxe que vous avez décrite: P>
// Copy is made: Employee frank = boss;
La FAQ C ++ a une bonne réponse à cette question spécifique: p>
http://www.parasht.com/c++ -faq-lite / références.html # FAQ-8.6 p>
Pas vraiment; Son fond de Java provoque une confusion de terminologie. Il ne demande pas des points de référence des pointeurs VS, mais des indicateurs VS VS Stack-Stack-alloua valeurs.
Généralement, vous voulez coller autant que possible de références. La raison est à cause de Raii . Fondamentalement, cela garantit aucune fuite de mémoire si vous utilisez Raii. p>
Cependant, vous devez utiliser des pointeurs lorsque les objets que vous utilisez seraient très coûteux. Passage autour des types de conteneurs entraînera des doublons des conteneurs ... pas une bonne idée. P>
Le meilleur moyen est d'utiliser Pointeurs intelligents ... Fondamentalement des références qui détiennent un pointeur et garder une trace du nombre de références au pointeur. C'est vraiment le meilleur des deux mondes ... initialisation / copies bon marché et comptage de référence pour éliminer pratiquement les fuites de mémoire. P>
Les pointeurs C ++ fonctionnent exactement comme des objets Java, en ce qu'ils peuvent être invalides ( Les références C ++ sont une mince emballage autour des pointeurs. Ils ne sont pas censés être invalides, mais dans certains cas peut être. Par exemple, une référence peut être créée à partir d'un pointeur code> null code> ou de la mémoire. Les références informatiques peuvent être supprimées. P> dans l'exemple de code que vous donnez: P> null code>) et pas cher à passer aux procédures. Employee boss("Frank");
Remarque: j'utiliserai "objet" pour désigner des objets et des types primitifs tels que INT, float ... Ce ne sont pas les mêmes en C ++ (mais vous pouvez généralement l'ignorer).
Utiliser des valeurs lorsque vous Créez un objet que vous contrôlez de cette portée et cela devrait mourir lorsque cette étendue se termine. En outre, utilisez la valeur lorsque vous souhaitez utiliser une copie d'un objet externe, mais que vous souhaitez uniquement gérer la copie et non l'objet réel. Exemple: P>
int myOtherFunction(int *external_value1, Object *external_value2{
---
}
"Référence" est un terme spécifique en C ++, donc j'ai légèrement modifié votre question pour utiliser la "valeur" plus correcte.
@John Millikin, merci d'avoir refusé mon message, vous avez eu mon intention correcte. Je trébuche encore parfois sur la nomenclature C ++.
Je vous recommande de sauter Java avant d'apprendre C ++. Ils sont différents et si vous essayez d'analoguer entre eux, vous allez seulement vous confondre, et moi.
Dupliquer, de toute façon: Stackoverflow.com/questions/1064325/... .
@Gman, j'ai fait une comparaison entre eux car j'ai trouvé des pointeurs similaires aux variables de référence de Java. J'ai ensuite déclaré que j'avais compris le comportement derrière les méthodes de création variable 2 C ++ et la seule question que je voulais répondre était quand il était approprié d'utiliser un particulier.
En effet, votre question est formulée très confortablement. En tout cas, la duplication répond à toutes vos questions.
@Gman, essayé de le nettoyer pour que vous puissiez le comprendre;).
Voilà y aller. Vous n'avez pas besoin de donner aux programmeurs C ++ deux exemples de la même chose, puis de ne pas tenir compte de l'un et de se reporter à un exemple non exemplifié avec un exemple explicite. C'est-à-dire, donnez deux exemples suivis de «les deux sont radicalement différents».