Strona główna

Hello World w C++

Programowanie w C++ nie boli - pod warunkiem, że chcesz się jego nauczyć. W niniejszym rozdziale nie skupimy się jeszcze na nauce programowania. Ważniejsza na chwilę obecną jest bowiem umiejętność posługiwania się edytorem Code::Blocks w stopniu, który umożliwi Ci swobodne pisanie pierwszych programów. 

Tworzenie pliku źródłowego

Pierwszą kwestią, którą się zajmiemy jest tworzenie nowych plików. Aby utworzyć plik należy wejść w menu File; z rozwiniętego menu wybrać pozycję New, a następnie kliknąć Empty File. To samo można uzyskać za pomocą skrótu klawiszowego CTRL+SHIFT+N - pamiętanie tego skrótu uważam jednak za wiedzę zbędną i w praktyce nie wpływającą na komfort przyszłej pracy ze środowiskiem. Pliki dodajemy bowiem do projektu zazwyczaj raz na jakiś czas. 

Zapisywanie pliku

Podstawową operacją, którą programista z dłuższym stażem wykonuje podświadomie jest zapisywanie zmian w pliku. Aby zapisać zmiany w kodzie należy wcisnąć klawiszeCTRL+S. Tą samą operację można również wybrać z menu File, a następnie klikając pozycję Save. Skrót ten powinien być bardzo często używany tak, aby zminimalizować ewentualne straty w przypadku zdarzeń losowych, tj. zawieszenia komputera lub zaniku prądu. W dzisiejszych czasach jest to już raczej rzadkość, a ponadto edytor zapisuje sam zmiany z chwilą kompilacji programu, tak więc skrót zapisywania stracił nieco na znaczeniu. 

Pamiętaj aby przy zapisywaniu pierwszy raz pliku nadać mu rozszerzenie .cpp. Jeżeli tego nie zrobisz środowisko Code::Blocks zapisze Ci plik z rozszerzeniem .c, co w konsekwencji przysporzy Ci problemów. Tak więc jeżeli będziesz zapisywał plik po raz pierwszy nadaj mu pełną nazwę z rozszerzeniem, np. zad01.cpp, a unikniesz wspomnianego wyżej problemu.

Kiedy wiemy, że plik został zmieniony

Wszystkie pliki, które masz obecnie otwarte są widoczne na zakładkach. Jeśli na początku nazwy zakładki widnieje gwiazdka (*) oznacza to, że plik nie jest zapisany. 

Jak powinien nazywać się plik źródłowy

Pliki, które piszemy w języku C++ powinny kończyć się rozszerzeniem *.cpp. Nazwa pliku może być w sumie dowolna. Przyjęło się jednak, aby programy w nazwie nie posiadały spacji i polskich znaków. Istnieją również pliki *.hpp i *.h jednak przez dość długi czas nie będziesz ich potrzebował tworzyć. 

Kod programu

Jeśli utworzyłeś już plik i nadałeś jemu odpowiednią nazwę to najwyższy czas by w nim coś napisać. Na początek przepisz następujący program: 

C/C++
#include <cstdio>
int main()
{
    printf( "Test dzialania Code::Blocks" );
    return 0;
}

Na chwilę obecną nie jest ważne co oznacza każda linijka tego programu. Posłuży on nam jednak do tego aby sprawdzić czy zainstalowałeś poprawną wersję Code::Blocks, tj. wersję z kompilatorem i czy działa ona prawidłowo. Ponadto dowiesz się jak kompilować programy i będziesz mógł stwierdzić, że faktycznie napisanie tych kilku linijek utworzyło normalny program, który można uruchamiać. 

Kompilacja programu

Mając do dyspozycji środowisko programistyczne kompilowanie programów sprowadza się do wciśnięcia określonych klawiszy na klawiaturze. W przypadku Code::Blocks kod programu kompilujemy poprzez wciśnięcie klawiszy CTRL+F9. Jeśli chcemy skompilować program i od razu go uruchomić wystarczy wcisnąć klawisz F9. Jeśli kompilowanie się nie powiedzie program nie zostanie uruchomiony pomimo użycia klawisza F9. 

Log kompilacji

Jeśli przepisałeś kod poprawnie i skompilowałeś kod programu za pomocą skrótu CTRL+F9 w zakładce Build Log powinieneś ujrzeć następującą treść: 

Compiling: C:\cpp0x.pl\kod0001.cpp 
Linking console executable: C:\cpp0x.pl\kod0001.exe 
Process terminated with status 0 (0 minutes, 0 seconds) 
0 errors, 0 warnings

Z powyższego loga wynika, że proces kompilacji zakończył się sukcesem i nie napotkano przy tym żadnych błędów. 

Jeśli zamknąłeś sobie przez przypadek panel w którym znajdowała się zakładka z logami - możesz go przywrócić wciskając klawisz F2

Zrzut ekranu - prawidłowy efekt przebiegu kompilacji

Pierwsza kompilacja w Code::Blocks - prawidłowy efekt przebiegu kompilacji
Pierwsza kompilacja w Code::Blocks - prawidłowy efekt przebiegu kompilacji

Pozostałe informacje

Jak już zapewne zauważyłeś po uruchomieniu programu na ekranie ukazała się konsola z następującą treścią: 

Test dzialania Code::Blocks 
Process returned 0 (0x0)   execution time : 0.069 s 
Press any key to continue. 

Jest to efekt działania przykładowego programu. Część treści została dołączona przez środowisko tylko po to, żebyś mógł zobaczyć efekt działania aplikacji. Treść o której mowa to: 

Process returned 0 (0x0)   execution time : 0.069 s 
Press any key to continue.

Jeśli uruchomisz program spoza środowiska Code::Blocks to na ekranie nie zobaczysz dwóch ostatnich wierszy. Warto też tutaj wspomnieć o tym, że program po prostu uruchomi się, wypisze tekst na ekranie i zniknie, tak więc w praktyce nie zobaczysz efektu jego działania jeśli nie uruchomisz go spod wiersza poleceń (aplikacja Windowsacmd.exe).

C++ - Wprowadzenie

C++ – język programowania ogólnego przeznaczenia.

Umożliwia abstrakcję danych oraz stosowanie kilku paradygmatów programowania: proceduralnegoobiektowego i generycznego. Charakteryzuje się wysoką wydajnością kodu wynikowego, bezpośrednim dostępem do zasobów sprzętowych i funkcji systemowych, łatwością tworzenia i korzystania zbibliotek (napisanych w C++, C lub innych językach), niezależnością od konkretnej platformy sprzętowej lub systemowej (co gwarantuje wysoką przenośność kodów źródłowych) oraz niewielkim środowiskiem uruchomieniowym. Podstawowym obszarem jego zastosowań są aplikacje i systemy operacyjne.

C++ został zaprojektowany przez Bjarne Stroustrupa jako rozszerzenie języka C o obiektowe mechanizmy abstrakcji danych i silną statyczną kontrolę typów. Zachowanie zgodności z językiem C na poziomie kodu źródłowego pozostaje jednym z podstawowych celów projektowych kolejnych standardów języka.

W latach 90. XX wieku język C++ zdobył pozycję jednego z najpopularniejszych języków programowania ogólnego przeznaczenia. Na początku XXI wieku liczbę programistów języka C++ szacowano na około 3 miliony[1].

Od 1998 obowiązuje standard ISO/IEC 14882:1998 (Standard for the C++ Programming Language) z drobnymi poprawkami zatwierdzonymi w 2003 r. (ISO/IEC 14882:2003). W 2009 roku ogłoszono nowy standard (tzw. C++0x), który zaczął obowiązywać od 12 sierpnia 2011 roku[2][3], lecz wciąż oczekuje na opublikowanie (ISO/IEC 14882:2011)[4][5].

 

 

 

Cechy standardów[edytuj | edytuj kod]

Projekt języka C++ usiłuje zachować możliwie jak największą zgodność (na poziomie kodu źródłowego) z językiem C. Zgodność pomiędzy obydwoma językami nie zawsze była całkowita, ale jak dotąd ewentualne różnice były w praktyce nieistotne[6]. Większym problemem związanym ze zgodnością była niekompatybilność kompilatorów języka C++ w zakresie obsługiwanej składni – przez wiele lat programy napisane pod jednym nie działały pod innym. Biblioteki C++ związane z interfejsami systemów nie są przenośne poza ich obręb, co wynika z faktu, że takie interfejsy są specyficzne dla danego systemu i nie dotyczy to wyłącznie C++.

Większość użytecznych programów w C++ wymaga stosowania bibliotek niestandardowych. Są one łatwo dostępne w Sieci zarówno jako produkty własnościowe, jak i jako FLOSS. Programy napisane w C++ mogą korzystać również z zasobów bibliotek języka C.

Język C++ posiada swój oficjalny standard (aktualnie jest to C++11 z 2011).

Język C++ nie jest własnością żadnej osoby, instytucji czy korporacji.

Właściwości języka[edytuj | edytuj kod]

  • Język C++ jest językiem wieloparadygmatowym[7]. Oznacza to, że można w nim stosować jednocześnie różne style programowania, w tym programowanie proceduralne, obiektowe, generyczne, jak również programować na poziomie asemblera.
  • Język C++ zakłada statyczną kontrolę typów; posiada też elementy dynamicznej kontroli typów.
  • Język C++ umożliwia bezpośrednie zarządzanie wolną pamięcią.
  • Projekt języka zakłada, że żadna nowa (względem języka C) cecha języka C++ nie może mieć negatywnego wpływu na szybkość działania programu lub zapotrzebowanie na pamięć operacyjną. Dzięki temu dobrze napisany program w C++ jest z reguły co najmniej równie szybki, jak jego odpowiednik napisany w C; co więcej, dzięki możliwości zastosowania algorytmów generycznych w wielu przypadkach C++ jest wyraźnie szybszy od C (np. podczas sortowania)[8].
  • Język C++ ze względu na bardzo rozbudowaną składnię oraz surowe wymogi w zakresie wydajności kodu stanowi duże wyzwanie dla twórców kompilatorów[8].
  • Do dziś (2012) żaden popularny kompilator nie jest w pełni zgodny z obowiązującym standardem języka, aczkolwiek ewentualne niezgodności dotyczą już tylko drugorzędnych cech języka (np. implementacji słowa kluczowego export)[9][10].

Historia[edytuj | edytuj kod]

Język C++ został stworzony w latach osiemdziesiątych XX wieku (pierwsza wersja pojawiła się w 1979 r.) przez Bjarne Stroustrupa jako obiektowe rozszerzenie języka C. Poza językiem C, na definicję języka C++ miały wpływ takie języki, jak Simula (z której zaczerpnął właściwości obiektowe) oraz AlgolAdaML i Clu.

Początkowo język C++ był dostępny w takim standardzie, w jakim opracowano ostatnią wersję kompilatora Cfront (tłumaczący C++ na C), później opublikowano pierwszy nieformalny standard zwany ARM (Annotated Reference Manual), który sporządzili Bjarne Stroustrup i Margaret Ellis. Standard języka C++ powstał w 1998 roku (ISO/IEC 14882-1998 "Information Technology – Programming Languages – C++"). Standard ten zerwał częściowo wsteczną zgodność z ARM w swojej bibliotece standardowej; jedyne, co pozostało w stanie w miarę nienaruszonym to biblioteka iostream.

Początkowo najważniejszą zmianą wprowadzoną w C++ w stosunku do C było programowanie obiektowe, później jednak zaimplementowano wiele innych ulepszeń, mających uczynić ten język wygodniejszym i bardziej elastycznym od swojego pierwowzoru. Niektóre zmiany w standardzie języka C były zainspirowane językiem C++ (np. słowo inline w C99).

Nazwa języka została zaproponowana przez Ricka Mascitti w 1983 roku, kiedy to po raz pierwszy użyto tego języka poza laboratorium naukowym. Odzwierciedla ona fakt, że język ten jest rozszerzeniem języka C. Wcześniej używano nazwy "C z klasami". Nazwa języka C++ nawiązuje do faktu bycia "następcą języka C", przez użycie w niej operatora inkrementacji "++".Inkrementacja to zwiększenie liczby o 1, w języku C++ do jej wykonania wykorzystywany jest ww. operator; dla przykładu:

zapis:

i=i+1; // zmiennej "i" przypisuje jej aktualną wartość, powiększoną o 1

... jest równoważny[11]

++i; // również powiększa wartość zmiennej "i" o 1.
// Uwaga! instrukcja i++ także zwiększa wartość zmiennej, po jej użyciu.

Nazwa C++ jest więc symbolicznym stwierdzeniem, iż jest to język C, unowocześniony, o większych możliwościach.

Pierwsze kompilatory języka C++, podobnie jak Cfront, były wyłącznie translatorami na język C. Kompilatory takie dostępne są i dziś. Jednym z nich jest Comeau C++ – jeden z niewielu kompilatorów oferujących pełne wsparcie dla standardu języka. Pierwszym kompilatorem natywnym (produkującym od razu kod asemblerowy) dla języka C++ był g++ z pakietu GCC, którego pierwszym autorem był Michael Tiemann, założyciel Cygnus Solutions.

Przykładowy program[edytuj | edytuj kod]

Poniższy program wyprowadza na standardowe urządzenie wyjścia napis "Hello world":

#include <iostream>
 
int main()
{
    std::cout << "Hello world\n";
}

Nowe cechy języka C++ względem języka ANSI C z 1989 roku[edytuj | edytuj kod]

Uwaga: niektóre z poniższych elementów trafiły do standardu języka C z 1999 roku (tzw. C99).

  • Możliwość programowania obiektowego:
    • Mechanizmy enkapsulacji:
      • funkcje składowe
      • sekcje prywatne, chronione i publiczne
      • zaprzyjaźnianie funkcji i klas
    • Klasy, jako rozszerzenie struktury o funkcje składowe, enkapsulację, dziedziczenie i polimorfizm
    • Obiekty, będące instancjami klas
    • Dziedziczenie (w tym dziedziczenie wielobazowe)
    • Metody wirtualne dostarczające polimorfizm
    • Konstruktory (służące również do niejawnej konwersji; później dodano również możliwość zakazania niejawnej konwersji przez konstruktor za pomocą explicit)
    • Destruktory, czyli funkcja wywoływana niejawnie przed (ściśle ustalonym) usunięciem obiektu
    • Operatory new i delete
    • Dynamiczna kontrola typów (RTTI), czyli dynamiczne (sprawdzane w czasie wykonywania) rzutowanie pomiędzy typami spokrewnionych klas, oraz określanie typu w czasie wykonywania (operatory dynamic_cast i typeid)
    • Słowo kluczowe this (dostęp do obiektu, na rzecz którego wołana jest metoda)
    • Wskaźniki do składowych (pól i metod)
    • Metody i pola statyczne
  • Udogodnienia związane z programowaniem generycznym:
    • Szablony (wzorce) klas i funkcji
    • Włączenie do biblioteki standardowej generycznej biblioteki STL
  • Obsługa wyjątków:
    • Deklaracja wychwytywania wyjątków: try ... catch
    • Deklaracja wywoływania wyjątku: throw
    • Deklaracja ograniczania wyjątków: throw(...) (określanie, jakie wyjątki mogą być propagowane z danej funkcji/metody)
  • Zmiany natury ogólnej:
    • Przestrzenie nazw i operator zasięgu ::
    • Traktowanie definicji zmiennych i obiektów jak zwykłych instrukcji
    • Dynamiczna inicjalizacja zmiennych globalnych i lokalnych zmiennych statycznych (tzn. mogą być inicjalizowane wartością funkcji)
    • Możliwość uzyskania dostępu do przesłoniętej zmiennej globalnej za pomocą operatora ::
    • Referencje
    • Słowa kluczowe constvolatile (również C99) i mutable (usuwanie modyfikatora const z podanego pola, jeśli taki został nadany całemu obiektowi)
    • Przeciążanie funkcji
    • Przeciążanie operatorów
    • Funkcje rozwijalne (inline) (również C99)
    • Nowy typ logiczny bool i stałe true i false (również C99, z tym że w C++ są to słowa kluczowe)
    • "Szeroki" typ znakowy, wchar_t (również C99) wraz ze wszystkimi zależnościami (np. klasy strumieniowe, w tym wiostream, oraz dodatkowe pliki nagłówkowe, np. wstring)
    • Operatory precyzyjnego rzutowania: dynamic_cast (rzutowanie tylko pomiędzy typami, z uwzględnieniem hierarchii klas), reinterpret_cast (rzutowanie wymuszone tylko pomiędzy typami) i const_cast (rzutowanie zmieniające modyfikatory typu const i volatile)

Reverse Engineering

Technika odwracania, inżynieria odwrotna, inżynieria wsteczna, programowanie zwrotne (ang. reverse engineering) – proces badania produktu (urządzeniaprogramukomputerowego) w celu ustalenia, jak on dokładnie działa, a także w jaki sposób i jakim kosztem został wykonany. Zazwyczaj prowadzony w celu zdobycia informacji niezbędnych do skonstruowania odpowiednika. Innym zastosowaniem jest porównanie lub zapewnienie współdziałania z własnymi produktami. Uwaga: inżynierii wstecznej nie należy mylić z business processreengineering czy z reengineeringiem oprogramowania, którego to inżynieria odwrotna jest tylko etapem wstępnym.

Inżynieria wsteczna jest często wykorzystywana w celu osiągnięcia pewnej funkcjonalności, przy ominięciu konsekwencji wynikających z praw autorskich lub patentów.

Jest także używana przez wojsko, w celu skopiowania technologii opracowanych przez inne państwa, często wspomagana działalnością wywiadowczą. Zjawisko to było powszechne podczas II wojny światowej i zimnej wojny.

Inżynieria wsteczna oprogramowania i elementów komputera może być stosowana w celu zapewnienia obsługi nieudokumentowanym standardom zapisu, protokołom komunikacyjnym czy teżurządzeniom peryferyjnym.

Inną przyczyną dokonywania inżynierii wstecznej jest przeprowadzenie audytu bezpieczeństwa, usunięcie zabezpieczeń przed kopiowaniem (cracking) lub chęć odblokowania ukrytej funkcjonalności produktu..