2017-06-13 1 views
0

Ich schrieb den folgenden Code, um zu testen, wie Werte eines Klassenobjekts in einer Funktion geändert werden.Ändern der Werte von Klasseninstanzen in einer Funktion

using namespace std; 

class test{ 
public: 
    int a; 
}; 

void runer(test testXX){ 
    testXX.a=10; 
} 

int main() 
{ 
    test test1; 
    test1.a=5; 
    runer(test1); 
    cout<<test1.a; 
    return 0; 
} 

Wenn ich den folgenden Code ausführen der Ausgang 5 und nicht 10 ist, ist es, weil ich nicht die Werte der Klasseninstanzen ändern kann, wie ich nicht die Werte der Array-Mitglieder ohne Zeiger ändern kann? Ich wäre dankbar, wenn jemand das klären könnte!

+4

Sie bedeutete wahrscheinlich 'Leere runer (Test & testXX)' – WhiZTiM

Antwort

1
void runer(test testXX){ 
    testXX.a=10; 
} 

nimmt eine vollständige Kopie des Typs test, so wird er in der Funktion geändert, aber eine andere Instanz zu dem in Haupt.

Parameter in C++ werden als Wert gesendet. Das einfachste Beispiel was Sinn macht, ist

int function(int value) { 
     for(; value > 0 ; value--){ 
      cout << "Hello\n"; 
     } 
} 

int main(int , char **){ 
     int value = 10; 
     function(value); // display 10 things 
     function(value); // display 10 things again (not modified). 
     function(5); // also not making sense, if parameter is modified. 
} 

Objekte zu ermöglichen, modifiziert werden, die sie benötigen, als Bezugnahmen auf die gesendet werden, oder Zeiger. Dadurch kann der Wert des Artikels geändert werden. Das Literal 5 kann nicht an eine Funktion gesendet werden, die eine Referenz erwartet.

void runer(test & testXX){ 
    testXX.a=10; 
} 

nun das gleiche Objekt wird aus dem Haupt zu runner gesendet, und Modifikationen sind das einzige Objekt durchgeführt.

+0

Vielen Dank für Ihre Hilfe jetzt alles macht Sinn! – GraphLearner

1

Sie übergeben das Argument an die Funktion nach Wert, so dass es eine lokale Kopie erhält, die nur so lange wie der Bereich der Funktion lebt.

Wenn die Funktion das übergebene Originalobjekt ändern soll, übergeben Sie es an den nichtkonstanten Verweis void runer(test& testXX).

0

Ihr Code ruft nach Wert auf. Daher erscheint die Änderung nicht im tatsächlichen Objekt. Um den Wert des Attributs des Objekts zu ändern, müssen Sie einen Verweis durchführen.

void runer(test &t){ 
    t.a = 10; 
} 
Verwandte Themen