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

question-closed cpp referencja

0 głosów
679 wizyt
pytanie zadane 7 listopada 2015 w C i C++ przez niezalogowany
zamknięte 7 listopada 2015

Witam.

Mam taki oto kod:

wxArrayString str;
  
  //Get All Files under /usr/sip directory recursively
  wxDir::GetAllFiles("/usr/sip",&str,wxEmptyString,wxDIR_FILES | wxDIR_DIRS);
  
  for (unsigned int index=0;index < str.GetCount();index++)
  {
    cout<< str[index]<< endl;
  }

Mógłby mi ktoś wyjaśnić jaki cel ma użycie tutaj referencji &str

Ten fragment kodu nie jest mojego autorstwa, staram się go zrozumieć

?

Link do całego art: 

http://www.codeprogress.com/cpp/libraries/wxwidgets/showWxExample.php?index=47&key=wxDirGetfileRecursively

komentarz zamknięcia: OT

2 odpowiedzi

0 głosów
odpowiedź 7 listopada 2015 przez criss Mędrzec (172,570 p.)
wybrane 7 listopada 2015
 
Najlepsza
To nie jest referencja, tylko adres (wskaźnik do str).

int& a = b; - deklaracja zmiennej referencyjnej
&b; - tak uzyskujesz adres (wskaźnik) na b

To, że funkcja przyjmuje argumenty przez referencje możesz ustalić podczas deklaracji, ale nie możesz do "zwykłej" funkcji działającej tylko na wartościach podać referencji (albo inaczej - możesz i nie ma to żadnego znaczenia, funkcja i tak wartość sobie skopiuje).
komentarz 7 listopada 2015 przez niezalogowany
edycja 7 listopada 2015

Tylko, że w tym przypadku zmienna referencyjna nie jest deklarowana.

Nie kumam dlaczego?

Przykładowo:

void nie_zwieksz (int i)
{
   ++i; // tak naprawdę funkcja nie robi nic, bo zmieniona zostaje tylko lokalna kopia
}
void zwieksz_c (int *i)
{
   ++(*i); // ta funkcja jest napisana w stylu C
}
void zwieksz_cpp (int& i)
{
   ++i; // ta funkcja wykorzystuje możliwości C++
}
int main ()
{
   int a = 0, b = 0, c = 0;
   nie_zwieksz (a);
   zwieksz_c (&b);
   zwieksz_cpp (c);
   cout << a << " " << b << " " << c; 
   // wypisze "0 1 1"

   return 0;
}

Zapis, który podałem wyżej zgadzałby się ze standardem C dlaczego tak się dzieje tego nie rozumiem?

Jak masz możliwość to objaśnij mi jak prostemu człowiekowi o co chodzi z tymi referencjami bo nie za bardzo to jestem w stanie zrozumieć, lub podaj link do jakiegoś art ale takiego co mi to objaśni (wszystko co znalazłem jest jakoś tak dziwnie opisane)


 

komentarz 7 listopada 2015 przez criss Mędrzec (172,570 p.)

No tak - nie ma tu żadnych referencji. Jak już mówiłem - przekazujesz wskaźnik i funkcja działa w sposób analogiczny do zwieksz_c().

Co do tych referencji. Zmienne referencyjne to takie aliasy dla innych zmiennych. Dla przykładu int& a = b; tworzy zmienną ref. będącą aliasem zmiennej int b. Od teraz odwołując się zarówno do a jak i do b, faktycznie robisz to samo.
W funkcji przyjmującej referencje, nie musisz wysyłać referencji. Funkcja na swoje potrzeby tworzy referencje do zmiennej którą podałeś. Dla przykładu, masz funkcje:

void f(int& arg){ ... }

Przekazując jej argument...

f(a);

...funkcja sobie robi, mniej wiecej to:

int& arg = a;
//a wlasciwie
int& arg(a); //deklaracja i inicjalizacja jednoczesnie zamiast deklaracja i przypisanie

Ale powtarzam - u ciebie nic takiego nie ma miejsca. GetAllFiles przyjmuje wskaźnik.

0 głosów
odpowiedź 7 listopada 2015 przez furas Maniak (53,800 p.)
Przekazujesz do funkcji adres pustej tablicy aby ta funkcja mogła w niej umieścić nazwy znalezionych plików. Po zakończeniu funkcji masz tablicę pełną nazw plików.
komentarz 7 listopada 2015 przez niezalogowany
edycja 7 listopada 2015

tylko nie rozumiem dlaczego nie ma deklaracji zmiennej referencyjnej?

Przykładowo:

void nie_zwieksz (int i)
{
   ++i; // tak naprawdę funkcja nie robi nic, bo zmieniona zostaje tylko lokalna kopia
}
void zwieksz_c (int *i)
{
   ++(*i); // ta funkcja jest napisana w stylu C
}
void zwieksz_cpp (int& i)
{
   ++i; // ta funkcja wykorzystuje możliwości C++
}
int main ()
{
   int a = 0, b = 0, c = 0;
   nie_zwieksz (a);
   zwieksz_c (&b);
   zwieksz_cpp (c);
   cout << a << " " << b << " " << c; 
   // wypisze "0 1 1"

   return 0;
}

Zapis, który podałem wyżej zgadzałby się ze standardem C dlaczego tak się dzieje tego nie rozumiem?

Jak masz możliwość to objaśnij mi jak prostemu człowiekowi o co chodzi z tymi referencjami bo nie za bardzo to jestem w stanie zrozumieć, lub podaj link do jakiegoś art ale takiego co mi to objaśni (wszystko co znalazłem jest jakoś tak dziwnie opisane)


 

komentarz 7 listopada 2015 przez niezalogowany
Już chyba zakumalem . Czy chodzi o to , że funkcja ma pracować na oryginalnej zmiennej?
komentarz 7 listopada 2015 przez Muminek Dyskutant (8,650 p.)
Dokladnie o to chodzi.

Podobne pytania

+1 głos
1 odpowiedź 415 wizyt
pytanie zadane 24 lutego 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)
0 głosów
3 odpowiedzi 1,968 wizyt
pytanie zadane 11 stycznia 2018 w C i C++ przez kptpiotr Początkujący (330 p.)
0 głosów
1 odpowiedź 1,414 wizyt
pytanie zadane 20 marca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

93,771 zapytań

142,731 odpowiedzi

323,383 komentarzy

63,373 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...