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

Usunięta treść Dodana treść
Lethern (dyskusja | edycje)
m Wycofano edycje użytkownika 178.42.72.21 (dyskusja). Autor przywróconej wersji to Piotr Całus.
Lethern (dyskusja | edycje)
m poprawki opisu, konwencje
Linia 1:
Jeśli użyjemy dowolnej wyszukiwarki internetowej, to powinniśmy bez problemu znaleźć prosty, szablonowy kod napisany w C++, który wyświetla napis „Hello World!”, w tłumaczeniu na polski „Witaj Świecie!”. Spójrzmy na niego:
 
<source lang="cpp">
#include <iostream>
//#include <iostream.h> --< niestandardowy nagłówek i nie potrzeba dopisywać następnej linijki
using namespace std;
 
int main ()
{
cout << "Hello World!" << endl;
Linia 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 manipulatora wyjścia "endl". Chyba że jest to uzasadnione: endl powodujewymusza 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. 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órydo umożliwiaobslugi namstrumieni międzyI/O, innymidzięki wypisywanieczemu pewnychmożemy informacjiwypisywać dane na ekran (ściślej: na standardowe wyjście). Dodatkowo istnieje plik nagłówkowy '''iostream.h'''. Jest to jednak nagłówek niestandardowy, pomagający zachować wsteczną zgodność.
 
Dzięki <tt>int main( ) {...}</tt> mogliśmysłuży otworzyćzdefiniowaniu ''funkcjęfunkcji głównągłównej'', która jest zawsze uruchomiana podczas startu naszego programu.
 
{{infobox|'''C a C++:'' 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: (...)}}
 
OperacjaWyrażenie <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ą znakuoperatora <tt><<</tt>, i wstawiliśmy nową linię, która jest zdefiniowana przezużyliśmy <tt>endl</tt>, który m.in. dodaje znak nowej linii.
 
Za pomocą <tt> return 0 </tt> informujemy system, że program działałmoże prawidłowozakończyć idziałanie niebez wystąpiłyzgłaszania żadne problemybłędów.
 
PowróćmyNa terazkoniec do tematu zadanego na początku, czyli po co wstawiliśmyzostawiliśmy linię z kodem <tt>using namespace std</tt>. WAby tymwyjaśnić celujej znaczenie, musimy omówić, czym są przestrzenie nazw.
 
== Przestrzenie nazw ==
Podczas pracy nad dużymi projektami, w których używa się wielu bibliotek z licznymi deklaracjami, możemy w końcu natknąć się na problem konfliktu nazw, gdy kilka obiektó, typów czy funkcji ma tę samą nazwę. Rozwiązaniem może być np. zamknięcie nazw w "zakresach", w celu oddzielenia ich. Z pomocą przychodzi nam mechanizm ''przestrzeni nazw''.
 
 
Spójrzmy jeszcze raz na nasz pierwszy program, tylko w trochę zmienionym wydaniu:
 
Linia 37 ⟶ 40:
#include <iostream>
 
int main( ()
{
std::cout << "Hello World!" << std::endl;
Linia 44 ⟶ 47:
</source>
 
Łatwo zauważyć, że usunęliśmy linię <tt>using namespace std</tt>, kosztem tego, że <tt>cout</tt> i <tt>endl</tt> musieliśmy poprzedzić nazwą <tt>std</tt> i operatorem <tt>::</tt>. Właśnie <tt>std</tt> jest nazwą pewnej przestrzeni nazw. W przestrzeni nazw <tt>std</tt> znajdziemy mnóstwo, a wręcz cały arsenał różnych narzędzi, począwszy od pewnych bardzo przydatnych funkcji, np. sortowania, wyszukiwania, a kończywszy na tak zwanych pojemnikach (kolekcjach), które pozwalają nam w łatwy sposób przechowywać pewne wartości. Oczywiście, aby mieć dostęp do tych narzędzi, musimy dołączyć odpowiedni plik nagłówkowy, używając do tego dyrektywy <tt>#include</tt>.
 
Pisząc <tt>std::cout <<</tt> informujemy kompilator, że chcemy wejśćużyć doznajdującego się w przestrzeni nazw <tt>std</tt> iobiektu skorzystać<tt>cout ze<<</tt>. znajdującejJeśli siępominiemy tamwzmiankę operacjio <tt>cout <<std::</tt>, pojawi się informacja o błędzie.
 
Poprzedni przykład pokazał nam, że nie musimy za każdym razem odwoływać się do przestrzeni nazw, kiedy chcemy wywołaćużyć pewną,znajdujących należącąsię dow niej funkcjęrzeczy. Używając <tt>using namespace przestrzenNazwprzestrzen_nazw</tt>, powiadamiamy kompilator, abyw wszystkoktórym comiejscu sięmoże znajdujeszukać wużywanych przestrzeniprzez nazwnas <tt>przestrzenNazw</tt>obiektów przeniósłi dofunkcji, „naszegoabyśmy pokoju”.mogli Dziękiswobodnie temuużywać niewszystkiego musimyco się martwić,znajduje w którym „pokoju” (czylidanej przestrzeni nazw), siętzn. cobez znajduje,dodatkowej ponieważwzmianki wszystkojak mamynp. pod ręką<tt>std::</tt>.
 
Oczywiście nie musimy naraz „przenosić” wszystkiego, co jest w danej przestrzeni nazw, możemy wykorzystać także pewne wybrane elementy. Używamy do tego operacji <tt>using przestrzenNazw::element</tt>. Zobaczmy przykład użycia tej operacji:
Linia 57 ⟶ 60:
using std::endl;
 
int main( ()
{
std::cout << "Hello World!" << endl;
Linia 77 ⟶ 80:
namespace HelloWorld
{
void hello( ()
{
std::cout << "Hello World!" << std::endl;
Linia 83 ⟶ 86:
}
 
int main( ()
{
HelloWorld::hello( ();
return 0;
}
Linia 97 ⟶ 100:
namespace Matematyka
{
int dodaj ( int a, int b )
{
return a+b;
}
 
int odejmij ( int a, int b )
{
return a-b;
Linia 110 ⟶ 113:
namespace Matematyka
{
int pomnoz ( int a, int b )
{
return a*b;
}
 
int podziel ( int a, int b )
{
return a/b;
Linia 131 ⟶ 134:
namespace Matematyka
{
int dodaj ( int a, int b );
int odejmij ( int a, int b );
}
 
using namespace std;
 
int main( ()
{
cout << Matematyka::dodaj ( 10, 20 ) << endl;
return 0;
}
Linia 144 ⟶ 148:
namespace Matematyka
{
int dodaj ( int a, int b )
{
return a+b;
}
 
int odejmij ( int a, int b )
{
return a-b;
Linia 159 ⟶ 163:
 
<source lang="cpp">
int Matematyka::dodaj ( int a, int b )
{
return a+b;
}
 
int Matematyka::odejmij ( int a, int b )
{
return a-b;
Linia 177 ⟶ 181:
<source lang="cpp">
#include <iostream>
 
int a, b;
int main( ()
{
int a, b;
std::cout << "Podaj dwie liczby a i b" << std::endl;
 
Linia 208 ⟶ 213:
using std::cin;
using std::endl;
 
int main () {
{
// wczytujemy imię
cout << "Podaj swoje imie: ";
Linia 217 ⟶ 224:
cin >> email;
 
informacja = imie + " (" + email + ")"; // suma napisów
cout << "Witaj " << informacja << endl;
 
informacja += " czyta ten napis";
cout << informacja << endl;
return 0;
Linia 243 ⟶ 250:
#include <string.h>
 
int main (int argc, char **argv)
{
if ( argc < 2 )
return -1;
return strcmp (argv[0], argv[1]);
}
</source>
Linia 257 ⟶ 264:
using namespace std;
int main (int argc, char **argv)
{
if ( argc < 2 )
return -1;
return strcmp( argv[0], argv[1]);
}
</source>
Linia 277 ⟶ 284:
<noinclude>
{{Nawigacja|C++|
[[../JakO czytać ten podręcznikpodręczniku/]]|
[[../Zmienne/]]|
}}</noinclude>