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

Usunięta treść Dodana treść
→‎Słowem wstępu: przez telefon niekoniecznie oboje usłyszą
m Update syntaxhighlight tags - remove use of deprecated <source> tags
Linia 4:
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:
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
using namespace std;
Linia 13:
return 0;
}
</syntaxhighlight>
</source>
 
<div style="width: 80%; background-color: #f2fff2; border: solid 1px #bfffbf; padding: 1em; margin: 15px auto;">
Linia 39:
Spójrzmy na kolejny program, zmienioną wersję poprzedniego:
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
 
Linia 47:
return 0;
}
</syntaxhighlight>
</source>
 
Widzimy tu wyrażenie <tt>std::</tt> pojawiające się przed <tt>cout</tt> i <tt>endl</tt>. Zapis ten oznacza, że wspomniane obiekty chcemy zaczerpnąć z przestrzeni <tt>std</tt>, a przy okazji nie obchodzi nas, czy są jakieś inne obiekty o takich nazwach. Jeśli jednak pominiemy wzmiankę o <tt>std::</tt>, pojawi się informacja o błędzie.
Linia 57:
Oczywiście nie musimy naraz "udostępniać" 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:
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
 
Linia 67:
return 0;
}
</syntaxhighlight>
</source>
 
Za pomocą <tt>using std::endl</tt> poinformowaliśmy kompilator, że będziemy mogli używać w kodzie <tt>endl</tt> i będziemy mieli na myśli właśnie to pochodzące z przestrzeni <tt>std</tt>. Nie wykonaliśmy tej operacji na elemencie <tt>cout</tt> (nie wstawiliśmy instrukcji <tt>using std::cout</tt>), więc musieliśmy go dalej poprzedzić nazwą przestrzeni.
Linia 76:
Przestrzeń nazw tworzymy za pomocą słowa kluczowego <tt>namespace</tt>, ograniczając jej zawartość klamrami. Możemy na przykład stworzyć przestrzeń nazw <tt>HelloWorld</tt> zawierającą funkcję <tt>hello( )</tt>:
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
 
Linia 92:
return 0;
}
</syntaxhighlight>
</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ę jawnie do <tt>HelloWorld</tt>, wystarczyłoby samo <tt>hello( )</tt>.
Linia 98:
Co ciekawe, nie musimy zamieszczać zawartości naszej przestrzeni nazw w jednym, ciągłym bloku. Możemy rozbić to na kilka części:
 
<sourcesyntaxhighlight lang="cpp">
namespace Matematyka
{
Linia 124:
}
}
</syntaxhighlight>
</source>
 
Wówczas wewnątrz przestrzeni nazw <tt>Matematyka</tt> znajdziemy wszystkie stworzone przez nas funkcje.
Linia 130:
Tworząc funkcję w 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 przestrzeni nazw lub poza nią, pisząc <tt>typ_zwracany PrzestrzenNazw::nazwa_funkcji( )</tt>, na przykład:
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
 
Linia 159:
}
}
</syntaxhighlight>
</source>
 
Jak wspomniano wcześniej, ostatnie dwie definicje funkcji moglibyśmy zapisać także w ten sposób:
 
<sourcesyntaxhighlight lang="cpp">
int Matematyka::dodaj (int a, int b)
{...}
Linia 169:
int Matematyka::odejmij (int a, int b)
{...}
</syntaxhighlight>
</source>
 
== Przestrzeń nazw <tt>std</tt> ==
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. Zobaczmy jak wczytywać pewne wartości do zmiennych, używając do tego ''cin'':
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
 
Linia 194:
return 0;
}
</syntaxhighlight>
</source>
 
Dzięki <tt>std::cin >></tt> możemy wczytać pewną wartość do zmiennej. Zmienna ta nie musi być liczbą, może być też np. napisem. W C++ tekst (łańcuch znaków) będziemy często przechowywali w obiektach typu <tt>string</tt> (który także znajduje się w <tt>std</tt>). Do jego obsługi będziemy musieli dołączyć do projektu bibliotekę <tt><string></tt>. Spójrzmy na przykład:
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
#include <string>
Linia 227:
return 0;
}
</syntaxhighlight>
</source>
 
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 243:
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.
 
<sourcesyntaxhighlight lang="cpp">
#include <string.h>
 
Linia 252:
return strcmp (argv[0], argv[1]);
}
</syntaxhighlight>
</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++ mógłby wyglądać następująco:
 
<sourcesyntaxhighlight lang="cpp">
#include <cstring> // zamiast <string.h>
Linia 265:
return std::strcmp( argv[0], argv[1]);
}
</syntaxhighlight>
</source>
 
Zauważmy, że: