Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Niejawne wywołanie konstruktora kopiującego.

Ostatnio zmodyfikowano 2016-10-26 20:36
Autor Wiadomość
hooterr
Temat założony przez niniejszego użytkownika
Niejawne wywołanie konstruktora kopiującego.
» 2016-10-26 19:09:13
witam,
może zacznę od kodu:
mam następująco rozpisaną klasę
class kalibracja
{
private:
    float a, b;
    char nazwa[80];
public:
    //-- konstruktor
    kalibracja(float wsp_a, float wsp_b, const char * txt);
    //-- konstruktor kopiujacy
    kalibracja(const kalibracja & wzor);

    //-- inne funkcje
    float energia( int kanal)
    {
        return ( (a * kanal) + b );
    }
    char * opis() {return (nazwa) ; }
};

kalibracja::kalibracja(float wsp_a, float wsp_b, const char *txt ) : a(wsp_a), b( wsp_b)
{
    strcpy(nazwa, txt);
}
kalibracja::kalibracja(const kalibracja & wzorzec)
{
    this -> a = wzorzec.a;
    this -> b = wzorzec.b;
    strcpy(nazwa, "-- To ja, kontruktor kopiujacy !!! --");
}

oraz funkcję (nie będącą składową żadnej klasy), która ma za zadanie we własnym zakresie stworzyć nowy obiekt, wypisać jego nazwę na ekran oraz zwrócić jego zawartość poprzez nazwę:
kalibracja fun_druga(void)
{
    kalibracja wewn(2, 1, "WEWNETRZNA");
    cout << "W funkcji fun_druga definiuje kalibracje i ma \nona opis : "
         << wewn.opis() << endl;
    return wewn;
}

Następnie w programie mam linijkę
cout "Rezultat funkcji ma opis: "<< (fun_druga() ).opis()<< endl;
//output: W funkcji fun_druga definiuje kalibracje i ma ona opis : WEWNETRZNA
//Rezultat funkcji ma opis: WEWNETRZNA

Cały problem polega na tym, że: w Symfonii C++ jest wyjaśnione, że kiedy fun_druga zwraca obiekt, zwraca go przez wartość to po wyjściu z tej funkcji obiekt wewn zostaje zniszczony, ale rezultat zostaje przekopiowany przez konstruktor kopiujący, więc output powinien być:
W funkcji fun_druga definiuje kalibracje i ma ona opis : WEWNETRZNA
Rezultat funkcji ma opis: -- To ja, kontruktor kopiujacy !!! --
ale nie jest. Dlaczego?
Czy funkcja zwraca obiekt przez referencje, albo pointer? W definicji funkcji nic takiego nie ma, więc obiekt powinien być zwrócony na takiej zasadzie jak typy wbudowane, przez wartość.
P-152956
Monika90
» 2016-10-26 19:44:55
P-152959
hooterr
Temat założony przez niniejszego użytkownika
» 2016-10-26 20:04:12
Czyli optymalizacja nie pozwala uruchomić konstruktora kopiującego tak?
P-152960
Monika90
» 2016-10-26 20:20:38
To właśnie niewywołanie konstruktora kopiującego jest tą optymalizacją. Program działa szybciej gdy nie wykona zbędnej (a być może kosztownej) operacji kopiowania obiektu. Kopiowanie jest zbędne, bo można utworzyć obiekt wewn od razu w miejscu docelowym przygotowanym przez funkcję main.
P-152961
hooterr
Temat założony przez niniejszego użytkownika
» 2016-10-26 20:25:37
Tak, rozumiem, ale ten kod miał cel bardziej edukacyjny niż praktyczny.
btw da się optymalizację wyłączyć?
P-152963
Monika90
» 2016-10-26 20:36:27
Można wyłączyć. W kompilatorze GCC jest opcja -fno-elide-constructors
P-152964
« 1 »
  Strona 1 z 1