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

question-closed cpp referencja

Object Storage Arubacloud
0 głosów
388 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,590 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,590 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ź 162 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,445 wizyt
pytanie zadane 11 stycznia 2018 w C i C++ przez kptpiotr Początkujący (330 p.)
0 głosów
1 odpowiedź 919 wizyt
pytanie zadane 20 marca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

92,565 zapytań

141,418 odpowiedzi

319,604 komentarzy

61,951 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!

...