2016-07-13 11 views
1

Dies ist eine einfache Sache, die ich nicht sicher bin, ob es in C++ wie in einigen anderen Sprachen möglich ist. Das Ding verhält sich wie eine Kopie, aber nicht dasselbe Objekt. Ich würde erwarten, dass, wenn dies Struct war, oder ein anderer Werttyp - dies wäre das erwartete Verhalten, aber für die Klasse, erwartete ich, dass dies so verhält, als ob ich "Referenz", das ist - das gleiche Objekt wie im Array ist . Was mache ich falsch?Wenn ein Klassenelement von Array geändert wird, verhält es sich wie eine Kopie, keine Referenz

// Example program 
#include <iostream> 
#include <string> 


class someclass 
{ 
    public:   
    void setn(int n2); 
    int n=10; 
}; 

void someclass::setn(int n2){ 
    n=n2; 
}; 


int main() 
{ 
    someclass moreofthem[5]; 
    someclass my=moreofthem[1]; 
    std::cout << "start value: " << my.n << " as inital\n"; //10 
    my.setn(2); 
    std::cout << "new value: " << my.n << " as expected\n"; //2 
    std::cout << "value in list: " << moreofthem[1].n << " why?\n"; //10? 

} 
+2

scheint wie du denkst 'class' und' struct' sind zwei verschiedene Konzepte in C++. Sie sind nicht. Der einzige Unterschied ist ihre Standard-Zugriffsspezifizierer – user463035818

+0

Ich sehe jetzt. Nun, ich hatte etwas Erfahrung mit.NET, und ich habe versucht, mit C++ mit den gleichen Konzepten zu spielen, aber wird offensichtlich nicht so funktionieren. – nekitip

Antwort

4

Das ist, weil das Objekt my eine Kopie moreofthem[1] ist, keine Referenz.

Wenn Sie einen Verweis wollen, müssen Sie das & -Zeichen verwenden, wenn Sie die Variable definieren:

someclass& my=moreofthem[1]; 
//  ^
// Note ampersand here 
3

Ich würde erwarten, dass, wenn diese Struktur wurde oder ein anderer Wert Typ - dieses Verhalten zu erwarten wäre , aber für die Klasse, ...

Die Schlüsselwörter class und struct können austauschbar verwendet werden. Der einzige Unterschied besteht darin, dass, wenn Sie keinen Zugriff angeben Modifikator der Standard würde sein:

  • public in struct
  • private in class

Das heißt,

someclass& my=moreofthem[1]; 

macht eine Referenz und das ist, was Sie suchen. Hier wird die Referenz my wirkt wie ein Alias ​​der ursprünglichen Variablen moreofthem[1]

5

Im Gegensatz zu C#, C++ macht keinen Unterschied zwischen einem struct und einem class. In der Tat sind die beiden completely interchangeable und folgen Wert Semantik.

Glücklicherweise C++ bietet auch Referenzen und Zeiger als Sprachkonstrukte, die Sie mit Verweisen auf Instanzen von Klassen und Strukturen beschäftigen lassen:

someclass moreofthem[5]; 
someclass& my = moreofthem[1]; 
//  ^
// That's it! Now you have yourself a reference 
std::cout << "start value: " << my.n << " as inital\n"; //10 
my.setn(2); 

oder wenn Sie es vorziehen Zeiger

someclass moreofthem[5]; 
someclass* my = &moreofthem[1]; 
//  ^ ^
// declare and use a pointer; note -> below 
std::cout << "start value: " << my.n << " as inital\n"; //10 
my->setn(2); 

Im Gegensatz zu C# , wobei class dafür sorgt, dass Instanzen über Referenzen behandelt werden (die eine Mischung aus C++ - Referenzen und C++ - Zeigern darstellen). Mit C++ können Sie entscheiden, wie Sie Ihre Instanzen behandeln möchten - nach Wert, Verweis oder Zeiger. Das Verhalten ähnelt dem ref-Parameter von C#, der für Objekte vom Werttyp übergeben wird, ist jedoch in allen Kontexten verfügbar, einschließlich Instanz- und lokalen Variablen. Dies gibt Ihnen mehr Flexibilität, um dasselbe Objekt durch eine Referenz oder durch einen Wert in verschiedenen Kontexten zu behandeln.