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

Wektory w parametrze funkcji

Object Storage Arubacloud
+1 głos
102 wizyt
pytanie zadane 23 sierpnia 2023 w C i C++ przez Janchess Początkujący (480 p.)
Czy wektory przekazywane są do funkcji jako oryginał czy jako kopie ?

2 odpowiedzi

+2 głosów
odpowiedź 23 sierpnia 2023 przez adrian17 Ekspert (344,860 p.)

Tak samo jak wszystko inne - zależy od typu argumentu.

// kopia
void f(int x);
void f(float x);
void f(JakasStruktura x);
void f(std::string x);
void f(std::vector<int> x);

// "przez wskaźnik" (wciąż kopia, ale... no, wskaźnika)
void f(int *x);
void f(JakasStruktura *x);
etc

// referencja
void f(int &x);
void f(std::vector<int> &x);
etc

 

komentarz 23 sierpnia 2023 przez Janchess Początkujący (480 p.)
Dlaczego zatem tablice nigdy nie są kopiowane ?
komentarz 23 sierpnia 2023 przez VNC Nowicjusz (240 p.)
taka specyfika C++
komentarz 23 sierpnia 2023 przez adrian17 Ekspert (344,860 p.)
edycja 23 sierpnia 2023 przez adrian17

"Stare" tablice to wyjątek, nie możesz zapisać przekazywania ich przez kopię bo język traktuje zapis tak jak gdyby był przekazywaniem wskaźnika:

void f(int tab[5]);
void f(int tab[]);
// to tak naprawdę jest to samo co:
void f(int *tab);

Można je wciąż przekazać przez referencję:

void f(int (&tab)[5]);

Ale no, często w takich sytuacjach się preferuje zamiast starych tablic używać std::array, który jest analogiczny do zwykłych tablic i można (tak jak wszystko inne) przekazywać go przez wartość/referencję/etc normalną składnią:

void f(std::array<int, 5> tab);

 

1
komentarz 24 sierpnia 2023 przez Oscar Nałogowiec (29,320 p.)

@Janchess, Bo język może nie znać rozmiarów tablicy.

+1 głos
odpowiedź 23 sierpnia 2023 przez tangarr Mędrzec (154,860 p.)

Wszystkie parametry przekazywane przez wartość są kopiowane. Żeby przekazać oryginalny parametr musisz przekazać referencję.

// funkcja która może zmodyfikować oryginalny wektor
void funkcja(std::vector<TYP> &wektor);

//funkcja która może tylko czytać z wektora bez modyfikacji
void funkcja2(const std::vector<TYP> &wektor)

 

Podobne pytania

0 głosów
1 odpowiedź 485 wizyt
pytanie zadane 28 kwietnia 2020 w C i C++ przez Adrian Maj Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 243 wizyt
pytanie zadane 18 kwietnia 2018 w C i C++ przez Perseusz Bywalec (2,190 p.)
0 głosów
0 odpowiedzi 601 wizyt
pytanie zadane 12 kwietnia 2017 w C i C++ przez ChiriChiri Obywatel (1,260 p.)

92,584 zapytań

141,434 odpowiedzi

319,670 komentarzy

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

...