Mam taki kod:
#include <iostream>
class array
{
public:
int capacity_;
array(int capacity);
array(const array &);
array & operator = (const array &);
};
array::array(int capacity)
{
capacity_ = capacity;
std::cout << "Z parametrem" << std::endl;
}
array & array::operator = (const array &arr)
{
capacity_ = arr.capacity_;
std::cout << "Przypisania" << std::endl;
return *this;
}
array::array(const array &arr)
{
std::cout << "Kopiujacy" << std::endl;
capacity_ = arr.capacity_;
}
array &fun1(array &tab)
{
return tab;
}
array fun2(array &tab)
{
return tab;
}
array fun3(array tab)
{
return tab;
}
int main(void)
{
array x(7), y(7);
std::cout << std::endl;
y = fun1(x);
std::cout << std::endl;
y = fun2(x);
std::cout << std::endl;
y = fun3(x);
std::cout << std::endl;
return 0;
}
I output jest taki:
Z parametrem
Z parametrem
Przypisania
Kopiujacy
Przypisania
Kopiujacy
Kopiujacy
Przypisania
Pierwsze 2 wiersze są oczywiste, ale nie mogę za bardzo sobie wyobrazić, jak to działa potem. Jak jest ta funkcja fun1
to argument jest referencją do obiektu, czyli przekazujemy tak naprawdę adres dox
z maina i potem operujemy na tym. I teraz się gubię. Bo &
przed nazwą funkcji oznacza, że zwracamy oryginał, a nie kopię obiektu, tak? Czyli idąc tą logiką w tym momencie (po wykonaniu się funkcji fun1
) x
i y
powinny mieć ten sam adres, a nie mają. Czyli coś źle sobie tłumaczę. No i potem nie jest wywoływany operator przypisania, a przy fun2
już jest. Proszę o wytłumaczenie