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

cout, cin jako obiekty niedostępne bez std: dlaczego?

0 głosów
399 wizyt
pytanie zadane 14 października 2018 w C i C++ przez Vitall Początkujący (400 p.)

Cześć,

jestem początkujący w C++ (i w ogóle w programowaniu).
Mam pewne niejasności, o wyjaśnienie których bardzo bym prosił.

Zaczynając pisać program, musimy użyć (w ogólności, bo zależy pewnie od potrzeby) dyrektywy #include aby załączyć plik nagłówkowy (dostępny standardowo) iostream, w którym są definicje obiektów cincout

Pierwsze pytanie: jak dokładnie wyglądają definicje obiektów strumieni wejścia/wyjścia i dlaczego plik iostream nazywany jest biblioteką?

Pytanie drugie: dlaczego samo załączenie pliku iostream nic nie daje, tzn. dlaczego obiekty cincout są niedostępne/zamknięte bez użycia przestrzeni nazw std (załączonej dyrektywą using) i skąd wiadomo, że właśnie przestrzeni nazw std trzeba użyć, a nie jakiejś innej? Jak to działa i dlaczego?

Wiem, że to są podstawy podstaw, ale rzeczy te mnie nurtują.
Będę wdzięczny za wyjaśnienia.
 

2 odpowiedzi

0 głosów
odpowiedź 14 października 2018 przez criss Mędrzec (172,640 p.)
wybrane 14 października 2018 przez Vitall
 
Najlepsza

jak dokładnie wyglądają definicje obiektów strumieni wejścia/wyjścia i dlaczego plik iostream nazywany jest biblioteką

Jeśli chodzi ci o std::cout/std::cin, to generalnie to są obiekty typów odpowiednio: std::ostream oraz std::cin. A realizacja działania jest zależna od implementacji (tzn. od kompilatora, którego używasz). 

dlaczego samo załączenie pliku iostream nic nie daje, tzn. dlaczego obiekty cincout są niedostępne/zamknięte bez użycia przestrzeni nazw std

Daje. Musisz użyć std:: (lub using namespace std;), bo tam się znajdują cin oraz cout.

 i skąd wiadomo, że właśnie przestrzeni nazw std trzeba użyć, a nie jakiejś innej?

Z dokumentacji. Poza tym - wszystkie standardowe funkcje/klasy/obiekty znajdują się w namespace std bezpośrednio lub pośrednio (np. w std::chrono lub std::filesystem) .

komentarz 14 października 2018 przez Vitall Początkujący (400 p.)
edycja 14 października 2018 przez Vitall

jak dokładnie wyglądają definicje obiektów strumieni wejścia/wyjścia i dlaczego plik iostream nazywany jest biblioteką

Jeśli chodzi ci o std::cout/std::cin, to generalnie to są obiekty typów odpowiednio: std::ostream oraz std::cin. A realizacja działania jest zależna od implementacji (tzn. od kompilatora, którego używasz). 

Znalazłem info, że cout jest obiektem klasy ostream, a cin jest obiektem klasy istream. Definicje obu klas znajdują się w pliku iostream. Na stronie jest opisane coś, ale nie mogę znaleźć dokładnego kodu, tzn. dokładnych definicji tych klas. Ponawiam pytanie (szukam po necie cały czas, ale różnie do mnie to trafia). Co to jest biblioteka? Ja to rozumiem jako plik, jak np. iostream, w którym są definicje klas, czy funkcji lub innych instrukcji, które są zebrane w jednym miejscu i potem dołączane do innych programów, aby móc skorzystać z tego, co ten plik oferuje, nie musząc ponownie definiować wszystkiego w naszym programie. 

 

dlaczego samo załączenie pliku iostream nic nie daje, tzn. dlaczego obiekty cincout są niedostępne/zamknięte bez użycia przestrzeni nazw std

Daje. Musisz użyć std:: (lub using namespace std;), bo tam się znajdują cin oraz cout.

No tego nie rozumiem. Skoro załączam plik iostream, w którym to zdefniowane mam czym jest cincout to po co mi przestrzeń nazw? (Rozumiem, że gdy się tego dowiem, to wtedy jakiej przestrzeni mam użyć, to mi powie dokumentacja). 
Innymi słowy jak cincout może znajdować się w std, skoro znajduje się w iostream?

 

 

1
komentarz 14 października 2018 przez criss Mędrzec (172,640 p.)

Na stronie jest opisane coś, ale nie mogę znaleźć dokładnego kodu, tzn. dokładnych definicji tych klas.

Bo nie ma dokładnego kodu. Jak mówiłem - jest zależny od implementacji. Implementacją zajmują się dostawcy/twórcy kompilatora. Standard opisuje co to ma robić, a dostawca kompilatora ma napisać w sposób dowolny coś co działa tak długo jak trzyma się wymagań postawionych przez standard.

Co to jest biblioteka?

W tym kontekście to jest plik opisujący deklaracje lub całe definicje (nie będę ci teraz zaśmiecał umysłu, ale niektóre konstrukcje muszą być również zdefiniowane w takich plikach). Różnica między deklaracją a definicją: deklaracja oznacza - "hej, istnieję", definicja oznacza - "hej, istnieję i działam w ten sposób". Jeśli dana konstrukcja nie musi mieć definicji w pliku (w postaci tekstowej, w kodzie c++), to najprawdopodbniej jest w postaci już skompilowanego kodu (też zwanego biblioteką swoją drogą XD przepraszam) który jest doklejany do napisanego przez ciebie kodu podczas linkowania (to co się dzieje po kompilacji). No a generalnie biblioteką nazywamy taki zestaw plików tekstowych z deklaracjami (i potencjalnie definicjami) oraz skompilowany już kod zawierający definicje których nie ma w pliku teskstowym. 

No tego nie rozumiem. Skoro załączam plik isotream, w którym to zdefniowane mam czym jest cincout to po co mi przestrzeń nazw?

Standardowe rzeczy w przesztreni nazw std, żeby nie zabierać nazw użytkownikowi języka (tzn. tobie jako programiście). Dzięki temu wciąż możesz sobie utworzyć jakąś zmienną o nazwie cout, bo std::cout jest w innej przesztrenii nazw. Możesz też tworzyć własne przestrzenie nazw z tego samego powodu. 

#include którego się używa do tego tzw. dołączania bibliotek jest po prostu chamskim wklejeniem zawartości dołącznego pliku. Tzn. zanim zacnzie się kompilacja, w miejsce #include <iostream> zostanie wklejona zawartość pliku iostream. Dlatego nadal musisz posługiwać się std::

1
komentarz 14 października 2018 przez criss Mędrzec (172,640 p.)
Te "pliki z deklaracjami" (zwykle o rozszerzeniu .h lub .hpp) możesz nazywać headerami lub nagłówkami. W kontekście tych standardowych (np. iostream) często nazywa się je bibliotekami, ale nie jest to zbyt poprawne..
komentarz 14 października 2018 przez Vitall Początkujący (400 p.)

Jeszcze jedno pytanie: jak mam definicję klasy, to mam opis własności jakimi będą charakteryzować się obiekty tej klasy i możliwości operowania na tych obiektach (metody).
Obiekt jest instancją klasy. Czy cout jest instancją klasy ostream
Czy to teraz nie jest przypadkiem tak, że za pomocą dyrektywy #include włączam plik z definicjami interesujących mnie klas, a instancje tych klas (czyli obiekty) mają swoje nazwy i do tego właśnie potrzebna mi jest przestrzeń nazw? To, że potrzebna jest std, to ogarniam z dokumentacji, jeśli nie wiem. 

Czy jestem na prostej? Ogranąłem to w końcu?

PS. Możliwe, że powtarzam to, co zostało już napisane, ale nie jestem pewniem, czy dotarło do mnie jak należy ;)

1
komentarz 14 października 2018 przez criss Mędrzec (172,640 p.)

Innymi słowy jak cincout może znajdować się w std, skoro znajduje się w iostream?

iostream to plik w jakim się znajduję. std to przestrzeń nazw. Przykładowy wygląd pliku iostream:

namespace std
{
   class ostream
   {
   // ... definicja
   };
   class istream
   {
   // ... definicja
   };

   extern ostream cout;
   extern istream cin;
}

 Czy cout jest instancją klasy ostream?

Tak. 

Czy to teraz nie jest przypadkiem tak, że za pomocą dyrektywy #include włączam plik z definicjami interesujących mnie klas, a instancje tych klas (czyli obiekty) mają swoje nazwy i do tego właśnie potrzebna mi jest przestrzeń nazw? To, że potrzebna jest std, to ogarniam z dokumentacji, jeśli nie wiem.  

Tak, dokładnie, to takie proste. 

komentarz 14 października 2018 przez Vitall Początkujący (400 p.)
Dzięki za pomoc :)
0 głosów
odpowiedź 14 października 2018 przez mhdv Obywatel (1,580 p.)
komentarz 14 października 2018 przez Vitall Początkujący (400 p.)
dzięki, ale nie jest tam dokładnie to, o co pytam ;)

Podobne pytania

0 głosów
0 odpowiedzi 111 wizyt
pytanie zadane 7 sierpnia 2021 w C i C++ przez Wiktor51207 Początkujący (340 p.)
0 głosów
1 odpowiedź 477 wizyt
pytanie zadane 13 marca 2019 w C i C++ przez Michał_Warmuz Mądrala (5,840 p.)
0 głosów
1 odpowiedź 1,777 wizyt
pytanie zadane 25 października 2018 w C i C++ przez XezolPL Obywatel (1,530 p.)

88,666 zapytań

137,277 odpowiedzi

306,618 komentarzy

58,867 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...