• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Operator indeksowy, wskaźnik, c++

Object Storage Arubacloud
0 głosów
1,088 wizyt
pytanie zadane 11 kwietnia 2018 w C i C++ przez antek782 Początkujący (490 p.)
    string operator[](int i)
    {
        if (liczba_nadziei > i) return "Jest tam nadzieja";
        else return "Nie ma tam nadziei";
    }

    operator string()
    {
    if (liczba_nadziei > 0) return "Jest gdzieœ nadzieja";
    else return "Brak nadziei";
    }
 cout << (string)(*studenci)[0] << endl;

Czemu w tym przypadku używany jest operator indeksowania?

 cout << (string)studenci[1] << endl;

A w tym przypadku operator string()?

2 odpowiedzi

+1 głos
odpowiedź 11 kwietnia 2018 przez draghan VIP (106,230 p.)
wybrane 11 kwietnia 2018 przez antek782
 
Najlepsza
Przecież w obu przypadkach są używane oba operatory. Bez kontekstu ciężko stwierdzić o co Ci chodzi.
komentarz 11 kwietnia 2018 przez antek782 Początkujący (490 p.)
W przypadku pierwszym konsola wpisuje "Jest tam nadzieja".

w Drugim przypadku wypisuje zaś "Jest gdzieœ nadzieja".
komentarz 11 kwietnia 2018 przez draghan VIP (106,230 p.)
Co kryje się za identyfikatorem "studenci"?
komentarz 11 kwietnia 2018 przez antek782 Początkujący (490 p.)

Cały program

#include <iostream>

using namespace std;

class Nadzieja
{
public:

    Nadzieja()
    { cout << "Rodzi sie nadzieja" << endl; }

    ~Nadzieja() { cout << "Nadzieja umiera" << endl; }

    Nadzieja(const Nadzieja &nadzieja) : poziom(nadzieja.poziom)
    { cout << "Nadzieja sie mnozy" << endl; }

    Nadzieja operator++(int)
    {
    poziom++;
    return *this;
    }

    int poziom = 1;
};


class Student
{
public:
    Student(float ilosc_nadziei = 2)
    {
        cout << "Student studiuje z nadzieja: " << ilosc_nadziei << endl;
        nadzieja = new Nadzieja[(int)ilosc_nadziei];
        liczba_nadziei = (int)ilosc_nadziei;
    }

    ~Student()
    {
        cout << "Student konczy studia" << endl;
        delete []nadzieja;
    }

    Student& dodajNadziei()
    {
        if (liczba_nadziei > 0)
        nadzieja[0]++;
        return *this;
    }

    string operator[](int i)
    {
        if (liczba_nadziei > i) return "Jest tam nadzieja";
        else return "Nie ma tam nadziei";
    }

    operator string()
    {
    if (liczba_nadziei > 0) return "Jest gdzieœ nadzieja";
    else return "Brak nadziei";
    }

    int liczba_nadziei;
    Nadzieja *nadzieja;
};


void kolokwium(Nadzieja &nadzieja)
{ cout << "Kolokwium" << endl; }


int main()
{
   cout << "Rok 1: " << endl;
   Student studenci[2];
   cout << "Rok 2: " << endl;
    (studenci[0].dodajNadziei());
   cout << "Rok 3: " << endl;
    cout << (string)(*studenci)[0] << endl;
   cout << "Rok 4: " << endl;
   cout << (string)studenci[1] << endl;
   cout << "Co dalej?" << endl;
}

 

komentarz 11 kwietnia 2018 przez draghan VIP (106,230 p.)

Ugh, bardzo... osobliwy ten program. :)

Pozwoliłem sobie dodać komentarz. Jeśli czegoś nie rozumiesz, pisz.

int main()
{
    cout << "Rok 1: " << endl;
    Student studenci[2];
    cout << "Rok 2: " << endl;
    (studenci[0].dodajNadziei());
    cout << "Rok 3: " << endl;

    /*
     * Identyfikator 'studenci' to nazwa tablicy obiektów typu Student.
     * W C++ nazwa tablicy jest jednocześnie adresem jej zerowego elementu,
     * dlatego możesz dokonać na niej dereferencji.
     * Usuńmy na moment rzutowanie na string, żeby nie zaciemniało zapisu.
     * Poniższe zapisy są równoważne:
     * (*studenci)[0]
     * (studenci[0])[0]
     * \ można pominąć nawias w drugiej wersji: studenci[0][0] \
     * Oznacza to pobranie zerowego elementu z tablicy i wywołanie na nim operatora indeksowania, co
     * prowadzi do kolejnej formy równoznacznej:
     * studenci[0].operator[](0).
     * Operator indeksowania klasy Student zwraca obiekt typu std::string, więc rzutowanie na string
     * nic w efekcie nie zmienia.
     */
    cout << (string) (*studenci)[0] << endl;
    cout << "Rok 4: " << endl;
    
    /*
     * Tutaj jest prościej: odwołujesz się do pierwszego elementu tablicy i dokonujesz
     * rzutowania obiektu typu Student na typ std::string:
     */
    cout << (string) studenci[1] << endl;
    cout << "Co dalej?" << endl;

    /*
     * Powyższe przypadki można sprowadzić do prostszego, jeśli pominąć użycie tablicy:
     */
    Student student;
    std::cout << static_cast<std::string>(student[0]) << '\n';
    std::cout << static_cast<std::string>(student) << '\n';
}

 

+1 głos
odpowiedź 11 kwietnia 2018 przez j23 Mędrzec (194,920 p.)

Dlatego, że w pierwszym przypadku robisz coś w stylu (string)studenci[0][0] (czyli wywołujesz operator [] dla pierwszego obiektu w tablicy studenci), a drugim - (string)studenci[1].

Podobne pytania

0 głosów
2 odpowiedzi 170 wizyt
pytanie zadane 9 stycznia 2018 w C i C++ przez lambdag Obywatel (1,310 p.)
0 głosów
2 odpowiedzi 250 wizyt
pytanie zadane 25 czerwca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
1 odpowiedź 441 wizyt
pytanie zadane 21 stycznia 2019 w C i C++ przez AuriattaDev Początkujący (390 p.)

92,555 zapytań

141,402 odpowiedzi

319,548 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...