Uczę się odniesienia do C++, a teraz jestem dość zdezorientowany różnicą między nazwą zmiennej a referencją. Kod testowy znajduje się poniżej:Różnica między referencją zmiennych i nazwą
class TestClass{
private:
int num;
public:
TestClass(int n):num(n){
cout<<this<<" : init of : " <<this->num<<endl;
}
TestClass(const TestClass& t):num(t.num){
cout<<this<<" : copyInit of : " <<this->num<<endl;
}
};
int main(int argc, const char * argv[]){
TestClass t = *(new TestClass(55)); //just to test copy initialization
const TestClass t2 = TestClass(100); //option1
const TestClass &t2 = TestClass(100); //option2
}
Tak więc mam dwie opcje tworzenia obiektu, które są ze sobą wyłączne.
W moim rozumieniu, jeśli użyję options2, kompilator utworzy tymczasowy obiekt w pamięci stosu i zwróci wartość odniesienia do t2.
Jeśli to prawda, w jaki sposób mogę zwerbalizować lub wyjaśnić opcję option1? Wygląda na to, że ten sam obiekt jest tworzony w pamięci stosów, a komputer nadaje mu nazwę "t2", ale nie rozumiem w jasny sposób, w jaki sposób ta opcja jest inna niż 2. nieco mylące.
Ponadto, alternatywnie przełączając opcje, mogłem zobaczyć, że obiekty są tworzone w różnych lokalizacjach pamięci w każdym przypadku. (Np przedmiotem opcja1 powstał w 0x7fff5fbff828, i że albo opcja2 był w 0x7fff5fbff820)
mógłbyś wyjaśnić
1. jaka jest różnica między nazwą zmiennej (Opcja 1) oraz odniesienia (Opcja 2) .
2. jak rzeczy działają w różny sposób w opcji 1 i 2.
3. dlaczego obiekty są tworzone w innym miejscu pamięci, zarówno w przypadkach.
Z góry dziękuję za pomoc!
chciałbym podjąć próbę odpowiedzi na to pytanie, ale 3rd pytanie mnie niepokoi ... Czy kod skompilować? –
@ LewsTherin Jeśli zmienisz nazwę pierwszej opcji, kompiluje. –
Należy zauważyć, że w 'TestClass t = * (new TestClass (55))' nie można już "usuwać" przydzielonej pamięci. –