Compréhension du transfert de valeur de Java :
Codage 1 :
public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); public static void SChange (StringBuffer str) { str= new StringBuffer("huang" } })Code 2 :
public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); public static void SChange (StringBuffer str) { //str= new StringBuffer("huang"); str.append(" huang");Utilisons deux images pour expliquer respectivement le code 1 et le code 2 ci-dessus :
état d'origine
Schéma du code 1 :
Compréhension du code 2 :
Dans le code 1, la référence de copie pointe vers un nouvel objet. Mais l'objet original reste inchangé.
Dans le code 2, la référence de copie modifie l'objet d'origine.
C'est le passage par valeur de Java.
La différence entre deux types de transfert en C++ :
Pour les méthodes de transmission de valeurs C++, de transmission de références et de pointeur, utilisez le code suivant pour comprendre et exécuter le test vous-même
#include <stdio.h> #include <iostream> #include <typeinfo> void ByValue(int a) { a = a + 1; } void ByRef(int& a) { a = a + 1; une) { *a = *a + 1; } int main(int argv, char** args) { int v = 1; ByRef(v); // Passer par référence ByPointer(&v); // Passer par valeur int* vp = &v; std::cout << v << std::endl; cout << typeid(vp).name() << std::endl; // std::cout << typeid(&vp).name() << std::endl; std :: cout << "fin" << std :: endl }La première est passée par valeur, et la seconde fonction est passée par référence, mais pour les deux dernières, la même fonction est appelée une fois par Call by référence et une fois par Call by value.
parce que:
ByPointer(vp); Si vp n'est pas modifié, il ne peut pas être modifié. Passer par valeur
ByPointer(&v); change v. Passer par référence (vous pouvez dire que ce qui est transmis est en fait l'adresse de v, et ByPointer ne peut pas changer l'adresse de v, il s'agit donc d'un appel par valeur. Cela semble explicite, mais l'adresse de v est une donnée pure. Quand l'appel n'existe pas dans le code carré. Pour l'appelant, il n'y a que v, et v est bien modifié par la fonction ByPointer. Ce résultat est exactement ce que Call by. Le comportement de référence. Considérer le comportement est l'intention initiale de la stratégie d'évaluation. Si tout est résumé en valeurs et que le problème est considéré du point de vue des données, il n'est pas nécessaire d'introduire le concept de stratégie d'évaluation pour confondre le public. )
nob : La compréhension ci-dessus est reconnue. La méthode de pointeur supplémentaire peut être utilisée de deux manières. Passage de valeur : passage d'un pointeur ; passage de l'adresse ou de la référence d'une variable si vous utilisez typeid(x).name() à ; vue &v et vp, vous constaterez que les deux sont de type Point, donc deux performances, le même résultat. Tu peux penser à moi comme ça
ParValeur(&v); //erreur
, tandis que le passage de paramètres de différents types en C++ ne transmettra pas directement la compilation.
Résumer:
Donc je pense que si on passe par valeur ou par référence, il suffit de voir comment ça se passe dans la mémoire.
Partager la mémoire signifie transmettre une référence, et copier la mémoire signifie transmettre une valeur (en laissant de côté certains cas particuliers au préalable)
Dans ce cas:
C/C++ : passage par valeur par défaut, passage par référence et les pointeurs sont compris séparément (les pointeurs peuvent être compris comme passant par valeur ou par référence, et les résultats sont les mêmes)
JAVA : les types de données de base sont passés par valeur, et les objets sont également passés par valeur (copiez la référence de cet objet)
C# : transmettre la valeur par type de valeur, transmettre par référence par type de référence, compréhension particulière de ref/out
Les chaînes en JAVA et C# nécessitent une compréhension particulière. L'apparence doit être transmise par valeur, mais l'implémentation réelle dépend de la machine virtuelle.