Wstęp do CPP/Podstawowe konstrukcje
Wprowadzenie do C++
Jężyk C++ został zaprojektowany jako ulepszony język C, zapewniający wsparcie dla programowania obiektowego. W zamierzeniach miał połączyć efektywność swojego poprzednika z wygodą obiektowych paradygmatów programowania. W efekcie zdecydowana większość konstrukcji z języka C została bezpośrednio przeniesiona do C++. --AMielczarek 19:43, 15 lis 2006 (CET)
Wymagania wstępne
Niniejszy rodział ma omawiać podstawowe konstrukcje języka C++. Ponieważ jednak zostały one w większości odziedziczone po poprzedniku to w centrum zainteresowania będą te które zmieniły się w stosunku do C.Dlatego też do rozpoczęcia lektury niniejszego kursu wskazana będzie znajomość tego języka.
Struktura programu w C++
Spójrzymy na poniższy program, który wypisuje na ekran słowo "Witaj!":
#include <iostream>
using namespace std;
int main(){
cout << "Witaj!" << endl;
return 0;
}
Już na pierwszy rzut oka można stwierdzić, iż wygląda on nieco inaczej, niż jego odpowiednik w języku C. Na początku programu deklarujemy pliki nagłówkowe:
#include <iostream>
#include to tzw. dyrektywa preprocesora, która spowoduje dołączenie tresci żądanego pliku nagłówkowego do naszego programu. Dyrektywa #include działa analogicznie jak w jezyku C, zmieniły się natomiast pliki, które będziemy dołączać do naszych programów. Język C++, jako szeroko rozpowszechnione narzedzie programisty, doczekał się rozbudowanej biblioteki standardowej o wiele bogatszej niż język C. Dołączony w powyższym przykładzie plik iostream zawiera definicje potrzebne do korzystania z operacji wejścia/wyjścia. Dodatkowo programista ma, podobnie jak w języku C, możliwość dołącania własnych plików nagłówkowych. Robi się to w następujący sposób:
#include "moj_plik_naglowkowy.h"
Plik o nazwie moj_plik_naglowkowy.h musi sie znajdowac w bieżącym katalogu. W przeciwnym przypadku musimy podać jego dokładną lokalizację na przykład:
#include "pliki_nagowkowe/moj_plik_naglowkowy.h"
Następnie występuje instrukcja:
using namespace std;
Wszystkie nazwy pochodzące zbiblioteki standardowej C++ są zadeklarowane w przestrzeni nazw (ang. namespace) std. Umieszczenie powyższej linijki w kodzie naszego programu jest informacją dla kompilatora umożliwia nam korzystanie z nich. Gdybyśmy tego nie zrobili oczywiście nadal moglibyśmy korzystać np. ze strumienia wyjścia, tyle że musielbyśmy nazwy nalezace do tej std poprzedzac napisem "std::", na przyklad: std::cout zamiast cout.
Po wyżej opisanych dyrektywach następuje treść programu:
int main(){
cout << "Witaj!" << endl;
return 0;
}
Każdy program musi zawierać funkcję main, która ma typ int, a wartość zwracana jest przekazywana przez program do systemu. Sterowanie w programie przebiega analogicznie jak w języku C. Main() to funkcja główna programu - jeśli skompilujemy i uruchomimy program to wykonana zostanie wyłączbnie jej treść. Jeśli funkcja main() zwraca wartość różną od 0 to oznacza to, iż program zakończył się z błędem. Znaczenie treści podanej w funkcji main zostanie wyjaśnione później w tym rozdziale.
Przegląd podstawowych konstrukcji
- Deklaracje.
Wszystkie nazwy i wyrażenia mają określony typ, który trzeba określić przed pierwszym użyciem. Służą temu deklaracje bardzo podobne do tych z języka C o postaci:
typ_zmiennej zmienna_1, zmienna_2, ..., zmienna_k;
na przykład:
int x;
char c1, c2, c3;
string napis_1;
char [20] napis_2;
char * s;
Warto zauważyć, że typ zmiennej może być zarówno predefinowany (jak w przykładach powyżej), albo może to byś typ zdefiniowany przez użytkownika. Podczas gdy standard ISO C zabraniał łączenia kodu i deklaracji, o tyle dobrym nawykiem programisty C++ jest deklarowanie zmiennej dopiero wtedy gdy jest ona potrzebna. Dzięki temu można ją od razu zainicjalizować:
int k = 10;
k = k * j;
int m = f(k);
Jest to wygodny mechanizm, ponieważ praktyka programowania w C pokazuje, że częśtym błędem jest korzystanie z wartości niezainicjalizowanych zmiennych. Należy jednak pamiętać że zmienna zadeklarowana w jakimś bloku jest widoczna tylko w jego obrębie. Na przykład kod:
int main(){
int i;
while (i < 2){
int a = i;
i++;
}
a = 2;
return 0;
}
nie skompiluje się, gdyż zmienna a jest widoczna tylko w bloku petli while.
Istotną konsekwencja takiego podejscia jest mozliwosc zainicjalizowania zmiennej sterujacej pętlą tak, aby była widoczna tylko w jej obrębie.
int main(){
for (int i = 1; i < 2; i++){
int a = i;
}
return 0;
}
Niepoprawny jest natomiast kod:
#include <iostream>
using namespace std;
int main(){
for (int i = 1; i < 2; i++){
int a = i;
}
int b = i;
return 0;
}
gdyż zmienna i została użyta poza blokiem w którym została zadeklarowana.