Mam następujący kod z kursu online C ++:

class tempStat
{
    public:
    // Data members.
    double minimum, maximum;

    // Constructor.
    tempStat(double min = 0.0, double max = 0.0)
        : minimum(min), maximum(max)
    {}

    // Helper method, to write a tempStat object to a file in binary format.
    void write(std::ostream & os)
    {
        os.write((char*)&minimum, sizeof(double));
        os.write((char*)&maximum, sizeof(double));
    }

    // Helper method, to read a tempStat object from a file in binary format.
    void read(std::istream & is)
    {
        is.read((char*)&minimum, sizeof(double));
        is.read((char*)&maximum, sizeof(double));
    }
}

Ta klasa jest używana jak:

tempStat ts;
ts.read(ifile);

Moje pytanie jest , jak możemy rzucić adres pamięci (&minimum) jako wskaźnik do {x1}}?

Po drugie, jeśli minimum był int, przypuszczalnie napisaliśmy ten sam kod (przynajmniej, o ile (char*)&minimum), więc jak to działa, że {{x3} } Może również być rzucane jako char*?

c++
2
butterflyknife 6 styczeń 2020, 14:51

1 odpowiedź

Najlepsza odpowiedź

Informacje w strumieniu przedstawiono w postaci sekwencji bajtów ({x0}} s).

Chcesz przeczytać te informacje w zmiennych {x0}} i maximum, które są double s.

Zakładasz, że czytając bajty, stanowią ważny reprezentację bajtową double w systemie.

"Alias" double s jako sekwencja bajtów (jest to dozwolone jako specjalna reguła w normie; zazwyczaj nie możesz udawać czegoś innego), a następnie daj wynik char* do funkcji "odczyt" strumienia.

Funkcja "czytania" strumienia uważa, że jest proszony o umieszczenie danych do tablicy {x0}}, ponieważ wygląda na to, jak wygląda char*, a ponieważ taka funkcja jest przeznaczona do zrobienia.

Tak więc sekwencja bajtów jest kopiowana przez funkcję "odczyt", do twojego double s.


Jest taki sam z funkcją write. Udajemy strumieniu, który dajemy mu sekwencję bajtów (tablica {x1}}), a my pozwolono nam to zrobić, ponieważ jest to fundamentalnie, co jest fundamentalnie co double jest , pod nim wszystko.


Po drugie, jeśli minimum był intr, prawdopodobnie napisaliśmy ten sam kod (przynajmniej, jeśli chodzi o (Char *) i minimum), więc jak to działa, jak i wyznaczalny może być również obsadzony jako znak *?

Ponieważ int jest reprezentowany przez sekwencję bajtów.

Każdy obiekt jest.

7
Lightness Races in Orbit 6 styczeń 2020, 11:55