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

metoda klasy string zwracajaca referencje do obiektu tej klasy.

Ostatnio zmodyfikowano 2016-11-16 23:37
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
metoda klasy string zwracajaca referencje do obiektu tej klasy.
» 2016-11-15 10:47:46
Witam. Natknalem sie na metode klasy string, ktora zwraca referencje do zmodyfikowanego obiektu. Tylko jak to dziala? Jak wyglada zwracanie referencji? Prosze o wytlumaczenie jak to dziala.
P-153722
mateczek
» 2016-11-15 11:35:26
to jest wręcz standardowa praktyka !!!
C/C++
#include <iostream>
#include<string>
using namespace std;

int main() {
    string s = "Alicja", s1 = "ma", s2 = "tygrysa";
    string s3 = s + s1 + s2; // s+s1 tworzy string i zwraca do niego referencje. Przez co możesz potem znów postawić znak + i dodać s2
    cout << s3;
}
zwracanie referencji do samego siebie wiąże sie ze wskaźnikiem "this"
C/C++
#include <iostream>

using namespace std;
struct counter
{
    int i;
    counter increment_1() //1 - pierwsza funkcja inkrementująca - zwraca przez wartość
    {
        ++i;
        return * this;
       
    }
    counter & increment_2() //2 - druga funkcja inrementująca - zwraca referencje
    {
        ++i;
        return * this;
       
    }
};
int main()
{
    counter licznik;
    licznik.i = 0;
    cout << licznik.i << endl;
    cout << "dokokonamy zwiększenia wartości przez potrójną inkrementacje = ";
    cout <<( licznik.increment_1().increment_1().increment_1() ).i << endl; //3
    cout << "ale na wszelki wypadek wyświetlimy zawartość licznika " << licznik.i << endl << "ups coś poszło nie tak :P" << endl;
   
    licznik.i = 0;
    cout << licznik.i << endl;
    cout << "dokonamy zwiększenia wartości przez potrójną inkrementacje = ";
    cout <<( licznik.increment_2().increment_2().increment_2() ).i << endl; //4
    cout << "wyświetlimy zawartość licznika " << licznik.i << endl;
}

Funkcja
counter & increment_2()
wywołana na rzecz obiektu "licznik" zwróci nam namiary na ten obiekt (coś jakby adres). Dzięki temu zabiegowi możemy ponownie zastosować opcję inkrementacji i ponownie będzie to się odbywało na rzecz obiektu "licznik"
P-153726
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-11-15 13:30:25
Ale funkcja zwroci adres i co dalej? Gdzies go przypisze? A moze ustawia wskaznik this na utworzonego stringa i jakoś zmieni adres na ktory wskazywal poprzedni this? Ps. Prosze bez struktur, jeszcze nie uczylem sie tego ;)
P-153728
Monika90
» 2016-11-15 13:39:21
@mateczek

C/C++
string s3 = s + s1 + s2; // s+s1 tworzy string i zwraca do niego referencje. Przez co możesz potem znów postawić znak + i dodać s2
Tworzy nowy string i zwraca go przez wartość, gdyby operator + zwracał referencję to by było bardzo źle.

P-153729
carlosmay
» 2016-11-15 14:55:02
P-153730
j23
» 2016-11-15 14:57:32
Prosze bez struktur, jeszcze nie uczylem sie tego ;)
Struktury to to samo co klasy, różnica jest tylko w domyślnym dostępie do pól - w strukturze wszystkie pola są domyślnie publiczne, a w klasie prywatne.


P-153731
mateczek
» 2016-11-15 15:13:47
Tworzy nowy string i zwraca go przez wartość, gdyby operator + zwracał referencję to by było bardzo źle.
racja mój błąd.

@latajacaryba
np. Chodzi o to by można było po użyciu funkcji dalej mieć namiary na obiekt. Wszelkiego rodzaju tasiemce.
cout<<a<<b<<c;
P-153733
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-11-15 15:22:22
Jasne, ja to rozumiem. Tylko spójrzmy, kiedy mamy coś takiego:
C/C++
int zwrot()
{
    int y = 5;
    return y;
}
int main()
{
    int x;
}

Kiedy wywołamy funkcję tak:
x = zwrot;
 to do x przypiszemy wartość y, czyli 5.
Kiedy funkcję wywołamy
zwrot();
 to ta wartość nam przepadnie (nigdzie nie zostanie przypisana).
No więc dlaczego analogicznie nie jest z funkcją zwracającą this? Wiem, to jest wskaźnik do obiektu na rzecz którego wywoływana jest dana metoda, ale co się dzieje po wywołaniu funkcji? Otrzymujemy nową tablicę, tak? I co dalej? this wskazuje na nią? Jak? No i potem zwracamy ten wskaźnik, ale nigdzie nie ma '=' więc wychodziłoby na to, że zwracamy tak, jak przykład z
zwrot();
P-153735
« 1 » 2 3
  Strona 1 z 3 Następna strona