Działanie konstruktora i operatora przypisania

0

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

1

fun1 zwraca wyrażenie, czyli klasę która to jest KOPIOWANA

array & array::operator = (const array &arr) 

masz tutaj operator kopiowania.
Aby przenieść obiekt potrzebujesz operatora przenoszenia z dwoma znaczkami &&. Wtedy będziesz miał te same adresy.
W 1 masz tylko "przepisania"
W 2 masz kopię zwracaną z funkcji
W 3 masz jedną kopię przekazywana do funkcji i jedną zwracaną

0

A powiedz mi jeszcze, czemu jakbym dodał kod

  array z = y; 

to by się uruchomił konstruktor kopiujący, a nie przypisania?

2

Miałem Ci wkleić wycinek standardu, no ale to dział Newbie, nie będę Cię katował. ;)
T a = b; to forma "jawnej inicjalizacji". Odpalony będzie tutaj zawsze odpowiedni konstruktor, bo obiekt jest - nomen omen - właśnie konstruowany.

Porównaj z:

T a; // zawołany będzie konstruktor domyślny
// a zostało skonstruowane
a = b; // zawołany będzie operator=

1 użytkowników online, w tym zalogowanych: 0, gości: 1