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

Usunięta treść Dodana treść
Nie podano opisu zmian
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:
 
<presource classlang="lang-cpp">
#include <iostream>
Linia 11:
return 0;
}
</presource>
 
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.
Linia 28:
Spójrzmy jeszcze raz na nasz pierwszy program, tylko w trochę zmienionym wydaniu:
 
<presource classlang="lang-cpp">
#include <iostream>
 
Linia 36:
return 0;
}
</presource>
 
Ł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, 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>.
Linia 46:
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 na przykład użycia tej operacji:
 
<presource classlang="lang-cpp">
#include <iostream>
 
Linia 56:
return 0;
}
</presource>
 
Za pomocą <tt>using std::endl</tt> poinformowaliśmy kompilator, że używany przez nas znak końca linii (czyli <tt>endl</tt>), znajduje się w przestrzeni nazw <tt>std</tt>. Dzięki temu możemy zamiast <tt>std::endl</tt> spokojnie pisać <tt>endl</tt> (nie powinno być problemów także wtedy, gdybyśmy napisali <tt>std::endl</tt>). Nie wykonaliśmy tej analogicznej operacji na elemencie <tt>cout</tt> (ściślej nie wstawiliśmy instrukcji <tt>using std::cout</tt>), więc musimy go dalej poprzedzać nazwą tej przestrzeni.
Linia 65:
Przestrzeń nazw tworzymy za pomocą słowa kluczowego <tt>namespace</tt>, ograniczając zawartość klamrami. Możemy na przykład stworzyć przestrzeń nazw <tt>HelloWorld</tt> zawierającą funkcję <tt>hello( )</tt>:
 
<presource classlang="lang-cpp">
#include <iostream>
 
Linia 81:
return 0;
}
</presource>
 
Oczywiście, gdybyśmy wstawili <tt>using namespace HelloWorld</tt> przed funkcją <tt>main</tt> (a nawet wewnątrz tej funkcji), nie musielibyśmy odwoływać się bezpośrednio do <tt>HelloWorld</tt>, wystarczyłoby samo <tt>hello( )</tt>.
Linia 87:
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:
 
<presource classlang="lang-cpp">
namespace Matematyka
{
Linia 113:
}
}
</presource>
 
Wówczas wewnątrz przestrzeni nazw <tt>Matematyka</tt> znajdziemy wszystkie stworzone przez nas funkcje.
Linia 119:
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 przestrzenNazw::nazwaFunkcji( typ0 arg0, typ1 arg1, ... )</tt> na przykład:
 
<presource classlang="lang-cpp">
#include <iostream>
 
Linia 147:
}
}
</presource>
 
Ostatnie 12 linii moglibyśmy zapisać także w ten sposób:
 
<presource classlang="lang-cpp">
int Matematyka::dodaj( int a, int b )
{
Linia 161:
return a-b;
}
</presource>
 
Zależy to wyłącznie od nas, który sposób będziemy chcieli wykorzystać.
Linia 168:
Wróćmy ponownie do standardowej przestrzeni nazw, jaką jest <tt>std</tt>. Dzięki plikowi nagłówkowemu <tt>iostream</tt> możemy operować na standardowym wejściu i wyjściu. Poprzednio dowiedzieliśmy się, jak wypisać pewien napis. Teraz zobaczymy jak wczytywać pewne wartości do zmiennych, używając do tego ''cin''.Zobaczmy na przykład:
 
<presource classlang="lang-cpp">
#include <iostream>
 
Linia 188:
return 0;
}
</presource>
 
Dzięki <tt>std::cin >></tt> możemy wczytać pewną wartość do dowolnej zmiennej. Zmienna ta nie musi być liczbą, może być także pewien tekst. W C++ bardzo często pewien tekst (łańcuch znaków) przechowuje się w zmiennej o typie string (który także znajduje się w <tt>std</tt>). Aby można było utworzyć taką zmienną trzeba najpierw dołączyć plik <tt>string</tt>. Zobaczmy na przykład:
 
<presource classlang="lang-cpp">
#include <iostream>
#include <string>
Linia 218:
return 0;
}
</presource>
 
Zauważmy, jak prosto się korzysta zmienną typu <tt>string</tt> (dla wtajemniczonych jest to pewna klasa). Jeśli chcemy dodać dwa napisy, wystarczy wykorzystać operator <tt>+</tt>. Możemy także wykorzystywać operator <tt>+=</tt>, jeśli chcemy dokleić do tekstu dodatkowy napis.
Linia 234:
Ponieważ język C++ jest (w pewnym uproszczeniu) rozwinięciem C, w dalszym ciągu można korzystać z [[C/Biblioteka standardowa/Indeks tematyczny|biblioteki standardowej]] C (tzw. libc). Ze względu na zachowanie wstecznej kompatybilności umożliwiono korzystanie z niej tak jak wcześniej w C.
 
<presource classlang="lang-cpp">
#include <string.h>
 
Linia 243:
return strcmp(argv[0], argv[1]);
}
</presource>
 
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łby następująco:
 
<presource classlang="lang-cpp">
#include <cstring> // zamiast <string.h> wykorzystujemy <cstring>
using namespace std;
Linia 257:
return strcmp(argv[0], argv[1]);
}
</presource>
 
Zauważmy, że: