C++/Przestrzenie nazw: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
brak spacji miedzy #include <iostream>
można też w c++ używać klasycznych nazw (z c)
Linia 3:
<source lang="cpp">
#include <iostream>
//#include <iostream.h> --< niestandardowy nagłówek i nie potrzeba dopisywać następnej linijki
using namespace std;
 
int main()
{
Linia 15 ⟶ 14:
<div style="width: 80%; background-color: #f2fff2; border: solid 1px #bfffbf; padding: 1em; margin: 15px auto;">
[[Grafika:Crystal_ktip.png|left|40px]]
Zaleca się używanie znaku nowej linii (\n) zamiast funkcjimanipulatora wyjścia "endl". Chyba że jest to uzasadnione: endl powoduje opróżnienie bufora, ale na przykład przy wielokrotnym zapisie na dysk może to obciążyć jego pracę.
</div>
 
Osoby, które już znają C, na pewno się domyślą, co mniej więcej się dzieje w tym kodzie. Nasuwa się tylko jedno pytanie -- po co jest ta wstawka <tt> using namespace std </tt>? O tym za chwilę. Najpierw, pokrótce omówimy, co ten program właściwie robi.
 
Za pomocą <tt>#include <iostream></tt> dołączyliśmy odpowiedni, tak zwany ''plik nagłówkowy'', który umożliwia nam między innymi wypisywanie pewnych informacji na ekran (ściślej na standardowe wyjście). Dodatkowo istnieje plik nagłówkowy '''iostream.h'''. Jest to jednak nagłówek niestandardowy
 
Dzięki <tt>int main( ) {...}</tt> mogliśmy otworzyć ''funkcję główną'', która jest zawsze uruchomiana podczas startu naszego programu.
 
{{infobox|W C++ pusta lista argumentów funkcji nie oznacza zmiennej listy argumentów, lecz pustą. Aby użyć zmiennej listy argumentów, należy wpisać w listę wielokropek: (...)}}
Operacja <tt>cout <<</tt> umożliwia nam wypisywanie pewnych informacji. W naszym przypadku wypisaliśmy napis „Hello World!”, a następnie „przedłużyliśmy” to polecenie za pomocą znaku <tt><<</tt> i wstawiliśmy nową linię, która jest zdefiniowana przez <tt>endl</tt>.
 
Operacja <tt>cout <<</tt> umożliwia nam wypisywanie pewnych informacji. W naszym przypadku wypisaliśmy napis „Hello World!”, a następnie „przedłużyliśmy” to polecenie za pomocą znaku <tt><<</tt> i wstawiliśmy nową linię, która jest zdefiniowana przez <tt>endl</tt>.
 
Za pomocą <tt> return 0 </tt> informujemy system, że program działał prawidłowo i nie wystąpiły żadne problemy.
Linia 66 ⟶ 67:
 
Ale właściwie do czego są używane przestrzenie nazw? Przede wszystkim zapewniają pewien komfort programiście. Pisząc np. jakąś funkcję, nie musimy się martwić jak się ją nazwie, ponieważ raczej nie spowoduje to żadnych kolizji nazw z nazwami innych funkcji, które na przykład znajdują się w innych bibliotekach (no chyba, że dana nazwa jest już zajęta w używanej przestrzeni nazw). Możemy w obrębie różnych przestrzeni nazw tworzyć funkcje o takich samych nazwach i deklaracjach, ale robiące zupełnie inne operacje!
{{infobox|W dalszej części podręcznika będzie używany zapis z przedrostkiem '''std::'''.}}
 
=== Tworzenie własnej przestrzeni nazw ===
Linia 88 ⟶ 90:
</source>
 
Oczywiście, gdybyśmy wstawili <tt>using HelloWorld::hello</tt> lub ogólnie <tt>using namespace HelloWorld</tt> przed funkcją <tt>main</tt> (a nawet wewnątrz tej funkcji), nie musielibyśmy odwoływać się bezpośredniojawnie do <tt>HelloWorld</tt>, wystarczyłoby samo <tt>hello( )</tt>.
 
Nie musimy zamieszczać od razu wszystkiego, co chcielibyśmy, aby się znalazło w naszej przestrzeni nazw. Możemy rozbić to na wiele części:
Linia 122 ⟶ 124:
Wówczas wewnątrz przestrzeni nazw <tt>Matematyka</tt> znajdziemy wszystkie stworzone przez nas funkcje.
 
Tworząc funkcję w pewnej przestrzeni nazw możemy wstawić samą deklarację, a potem w innym miejscu podać pełną definicję tej funkcji. Możemy na co najmniej dwa sposoby podać definicję pewnej funkcji -- wewnątrz definicji przestrzeni nazw lub pisząc <tt>typ_zwracany przestrzenNazwPrzestrzenNazw::nazwaFunkcjiNazwaFunkcji( typ0 arg0, typ1 arg1, ... )</tt> na przykład:
 
<source lang="cpp">
Linia 175 ⟶ 177:
<source lang="cpp">
#include <iostream>
int a, b;
 
int main( )
{
std::cout << "Podaj dwie liczby a i b" << std::endl;
int a, b;
 
// wypisujemy "a:" na wyjście i czekamy na wpisanie liczby a
Linia 201 ⟶ 202:
#include <string>
 
std::string imie;
using namespace std;
std::string email;
 
std::string informacja;
int main( )
using std::cout;
{
using std::cin;
string imie;
using std::endl;
string email;
int main( ) {
string informacja;
// wczytujemy imię
cout << "Podaj swoje imie: ";
Linia 250 ⟶ 251:
</source>
 
Jednak dostępna jest też wersja libc przygotowana specjalnie dla C++. Pliki nagłówkowe są w niej inaczej nazywane, wszystkie funkcje znajdują się dodatkowo w przestrzeni nazw std. Tak więc powyższy program napisany w sposób właściwy dla C++ wyglądałbymógłby wyglądać następująco:
 
<source lang="cpp">
Linia 272 ⟶ 273:
 
W swoich programach lepiej jest używać wersji przygotowanej dla C++. Po pierwsze, dzięki przestrzeniom nazw unikniemy kolizji nazw z własnymi funkcjami. Po drugie, wersja ta ma wbudowaną obsługę [[C++:Obsługa wyjątków|wyjątków]]. Po trzecie, czasami libc przygotowana dla C wywołuje ostrzeżenia lub błędy kompilacji w kompilatorach C++.
{{infobox|Można też w C++ używać klasycznych nazw (z C) (<tt>stdio.h</tt>, <tt>stdlib.h</tt>, <tt>string.h</tt>, ...), ale czasami libc przygotowana dla C wywołuje ostrzeżenia lub błędy kompilacji.}}
 
<noinclude>