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

funkcja auto wyjasnienie.

VPS Starter Arubacloud
0 głosów
2,642 wizyt
pytanie zadane 11 sierpnia 2016 w C i C++ przez sprytny22 Obywatel (1,130 p.)

Witam, czytałem juz o tym w google ale nie zrozumialem do konca a wiec, co robi funkcja auto?

Chodzi mi np o takie zastosowanie w bilbiotece SFML:

http://quirinnos.pl/kurs-sfml-2-1-2-3-9-snake/

 w tej lini :

void Snake::Draw(sf::RenderWindow &window)
{
    for(auto node : nodes)
    {
        window.draw(node);
    }
 
}

 

3 odpowiedzi

+7 głosów
odpowiedź 11 sierpnia 2016 przez Sebastian Fojcik Nałogowiec (43,040 p.)
edycja 11 sierpnia 2016 przez Sebastian Fojcik
 
Najlepsza

Słowo kluczowe auto dobiera do zmiennej odpowiedni typ. Warunkiem użycia auto jest inicjalizacja takiej zmiennej. Nie można zrobić tak:

auto n;
n = 5;

Ale można tak:

auto n = 5;

Zmienna "n" będzie typu int. A to dlatego, że liczba "5" w C++ to tzw. stała dosłowna będąca typem int. Jeśli chciałbyś zrobić zmienną typu long, to zapiszesz tak:

auto n = 5L;

A jeśli chcesz utworzyć zmienną unsigned long long int, to piszesz tak:

auto n = 5uLL;

Inne przykłady:

auto a = 5;       // int
auto b = 5L;      // long
auto c = 5u;      // unsigned int
auto d = 5.0;     // double
auto e = 5.0f;    // float
auto f = 5.0L;    // long double
auto g = 'a';     // char
auto h = L'a';    // wchar_t
auto i = "Ala";   // const char*
auto j = L"Ala";  // const wchar_t*
auto k = true;    // bool

Rozmiar liter nie ma znaczenia. Możesz pisać 'u' albo 'U'.
Zabiegi z auto są bardzo użyteczne. W Twoim przypadku utworzyłeś pętlę foreach, która przeiteruje po wszystkich elementach nodes. Tworząc pętlę nie musisz wiedzieć jakiego typu jest jeden element node. 

Inny przykład:

int tablica[] = {1, 2, 3, 4};

for( auto x : tablica )
     cout << x;

Pętla wypisze każdy element 1234. Zmienna "x" jest w tym momencie elementem tablicy. NIE wskaźnikiem, lecz zwykłą wartością int (bo takiego typu są elementy tablicy). Należy jeszcze zwrócić uwagę, że w takiej pętli nie możesz na stałe modyfikować elementów. Przykład: (tablica taka jak powyżej)

// wypisze: 1111
for( auto x : tablica )
{
     x = 1;
     cout << x;
}

Ale uwaga:

for( auto x : tablica )
     x = 1;

// wypisze 1234
for( auto : tablica )
     cout << x;

Jak widać elementów nie zmieniliśmy na stałe w pierwszej pętli. Warto o tym pamiętać, aby uniknąć kiedyś dziwnych problemów.
Łatwe, proste i przejrzyste.

Pozdrawiam :-)

1
komentarz 11 sierpnia 2016 przez criss Mędrzec (172,590 p.)

To dość oczywiste, bo każdy element tablicy jest kopiowany do x. Jeśli chcemy zmieniać wartości, to nic nie stoi na przeszkodzie, żeby napisać

for (auto & x : tablica)

(x jest referencją)

komentarz 11 sierpnia 2016 przez Damian11131 Stary wyjadacz (13,490 p.)
Plus za użycie słowa "inicjalizacja". Po prostu gotuję się od środka, gdy ktoś używa słowa "inicjacja"...
komentarz 11 sierpnia 2016 przez Sebastian Fojcik Nałogowiec (43,040 p.)

@Criss
Dzięki za uzupełnienie. Rzeczywiście warto wspomnieć o referencji.

@Damian11131
To lepiej nie zaglądaj do matur z informatyki CKE. Oni tam wszystko "inicjują". Ale czego oczekiwać od starych, akademickich dziadków... ta pomyłka wynika z błędów tłumaczeniowych literatury IT w "tamtych" czasach + że uczą tak studentów. Tłumaczenia spowodowały również powstanie w Polsce (i tylko w Polsce) tłumaczenia overload na przeciążenie (funkcji / operatora...).
W każdym innym języku jest to przeładowanie. Ciężko będzie te przeciążenie i inicjację wyplewić z języka, oj ciężko...

komentarz 11 sierpnia 2016 przez criss Mędrzec (172,590 p.)
Małe pytanko, jak sie tak linkuje czyjś profil?
komentarz 11 sierpnia 2016 przez Sebastian Fojcik Nałogowiec (43,040 p.)
edycja 11 sierpnia 2016 przez Sebastian Fojcik
Ja zwyczajnie zaznaczam Twój nick, Ctrl+C i Ctrl+V. Małpę stawiam, bo spodobała mi się taka konwencja odpowiadania ;-)
komentarz 11 sierpnia 2016 przez criss Mędrzec (172,590 p.)

Sebastian Fojcik o, działa XD Sorry za spam

+2 głosów
odpowiedź 11 sierpnia 2016 przez criss Mędrzec (172,590 p.)

Nie funkcja, a słowo kluczowe. 

auto mówi kompilatorowi, żeby sam ogarnął jakiego typu ma być zmienna na podstawie przypisanej wartości (ofc auto działa w czasie kompilacji).

Np.:

auto a = 1; // int
auto b = 1.f; // float
auto c = 2.0; // double

Tutaj masz ranged for z c++11. Tzn przy każdej iteracji przypisz do node kolejny element kontenera nodes

komentarz 11 sierpnia 2016 przez sprytny22 Obywatel (1,130 p.)
czyli node staje sie taka jak by tablica z elementami nodes?
komentarz 11 sierpnia 2016 przez criss Mędrzec (172,590 p.)

Nie, node jest pojedynczą zmienną typu przechowywanego przez dany kontener.

Np.:

std::vector<float> v;
for(auto node : v) { /* ... */ } // node jest typu float

 

komentarz 11 sierpnia 2016 przez dziki indyk Użytkownik (940 p.)

pętla zakresowa działa tak:
dla każdego elementu zbioru nodes przypisz do node wartość tego elementu i wykonaj instrukcje w klamrze.

 

for(auto node : nodes)
{
    window.draw(node);
}

można zastąpić tak:
 

for (int i = 0; i < nodes.size(); i++)
{
    window.draw( nodes[i] );
}

albo z iteratorami:
 

for (auto it = nodes.begin(); it != nodes.end(); i++)
{
    window.draw( *it ); //chociaż sposób dostania się do elementu zależy od specyfikacji kontenera
} 

 

+1 głos
odpowiedź 11 sierpnia 2016 przez niezalogowany
ale Ty nie masz tutaj funkcji auto, nie ma nazwy, ani typu zwracanego. Słowo auto oznacza że zmienna sama się dostosuje do typu na jaki jej będzie przypisany

Podobne pytania

+3 głosów
1 odpowiedź 603 wizyt
0 głosów
1 odpowiedź 317 wizyt
pytanie zadane 17 kwietnia 2019 w C i C++ przez de1vee Nowicjusz (220 p.)
0 głosów
1 odpowiedź 223 wizyt
pytanie zadane 12 grudnia 2016 w C i C++ przez Malkow Początkujący (330 p.)

92,845 zapytań

141,784 odpowiedzi

320,859 komentarzy

62,177 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...