2010-10-29 3 views
2

Bonjour
En C++, vous pouvez effectuer les tâches suivantes:pointeur deferencing et manipuler des objets qui sont pointés à - constructions équivalentes en Java

int x = 5 

cout << x; 
// prints 5 

int* px = &x; 

(*px)++; 
cout <<x; 
// prints 6 

Y at-il une construction équivalente en Java

+5

Cet extrait de code ne contient aucun pointeur sur les pointeurs. –

+0

Ce n'est pas non plus du C++. C'est C. Donc, bien qu'il puisse être utilisé à partir de C++, un vrai programme C++ est plus susceptible d'utiliser une référence. –

+1

@Martin - Je suis sûr que c'est C++ et pas C. Sauf s'il y a un entier appelé cout déclaré. –

Répondre

3

Pour ce faire, vous devez créer un objet qui contient un int. Ensuite, vous pouvez passer une référence à cet objet, et vous pouvez incrémenter l'int qui est dans cet objet. Mais il est impossible d'avoir une autre référence au même int et les incréments dans l'un incrémenteront l'autre - à moins que les deux cas ne soient des références au même objet wrapper.

+3

+1, il existe même une classe générique qui le fait déjà: [Holder ] (http://download.oracle.com/javase/6/docs/api/javax/xml/ws/Holder.html) – casablanca

+1

Cela ne fonctionnera pas dans ce cas particulier car 'Integer' est immuable: vous pouvez passer un objet Holder , mais vous ne pouvez toujours pas changer l'entier qu'il contient. –

0

No .. Java fait abstraction du concept de pointeurs et d'emplacements de mémoire. Les pointeurs et le déréférencement de pointeurs ne sont pas possibles en Java.

1

Non en tant que tel.

Vous pouvez penser à Java en passant tout par référence, donc

Foo f1 = new Foo(); 
Foo f2 = f1; 

signifie f2 et f1 pointent vers le même objet (contrairement à C++ où l'affectation serait une copie). Le code C++ équivalent ferait f2 un Foo&. Java sera autobox int s à Integer s, mais Integer s sont immuables. Donc, vous devez soit écrire le vôtre MutableInteger, ou utiliser quelque chose comme le java.util.AtomicInteger si vous voulez passer par référence et modifier les valeurs comme un effet secondaire (que je soupçonne être votre motif sous-jacent). Malheureusement, vous ne pouvez pas surcharger les opérateurs en Java, donc la syntaxe sera plus verbeuse que le code C++ équivalent.

+0

malheureusement? C'est l'une des caractéristiques de Java :-) –

+1

Heh. Ce serait bien parfois. De même, 'const', d'ailleurs (et non,' final' ne le coupe pas). –

+0

BTW Java passe tout en valeur, même en référence. Il n'y a pas d'appel par référence en Java. –

2

La réponse est "sorte de". Tant que vous avez affaire à des primitives, enveloppez simplement la valeur dans un tableau.

int[] a = {5}; 
int[] b = a; 
b[0]++; 
System.out.println(a[0]); 

Comme d'autres l'ont souligné, pour des problèmes plus complexes, votre meilleur pari est toujours de créer un objet avec une méthode « incrément » ou « ensemble » qui modifie une valeur stockée.

+0

Est-ce que Java ne fait pas l'auto-boxing des primitives. –

+0

Je m'excuse, je ne suis pas tout à fait sûr de ce que vous obtenez, mais je vais essayer de répondre. Java uniquement les primitives de boîtes automatiques lors de la conversion vers et à partir des Classes d'encapsulage automatique (c.-à-d. Entier, Court, Long, etc ...). Autrement, Java traite effectivement les types primitifs comme des primitives. http://leepoint.net/notes-java/data/basic_types/autoboxing.html montre comment certaines instructions de code en Java sont interprétées. –

Questions connexes