14.1 Wstęp

C++ jest językiem obiektowym, a więc oczywiście umożliwia definiowanie nowych typów danych bogatszych niż proste C-struktury, które zawierały wyłącznie dane, bez opisu operacji, jakie na tych danych można wykonywać — operacje takie trzeba w C definiować za pomocą globalnych funkcji.

Klasa jest uogólnieniem typu: w zasadzie dobrze zdefiniowana (tzw. pierwszorzędowa) klasa zachowuje się dokładnie jak typ wbudowany (nie jest tak w Javie). Aby ta analogia była pełna, projektanci C++ zadbali nawet o to, żeby „prawdziwe” typy wbudowane mogły być używane zgodnie ze składnią właściwą dla klas definiowanych przez użytkownika; tak na przykład, dopuszczalne jest definiowanie wraz z inicjalizacją zmiennych typów wbudowanych, jak int albo double, poprzez wywołanie „konstruktora”:

       int k(5);
albo
       double *p = new double(6.5);
Tak naprawdę żadnego konstruktora nie ma, bo intdouble są typami wbudowanymi, ale składnia jest taka, jakby tworzone zmienne były obiektami klasy.

Składnikami klasy są w zasadzie pola i funkcje, zwane razem składowymi klasy. Ale klasa stanowi też osobną przestrzeń nazw: wewnątrz klasy można definiować nowe typy, jak i nowe aliasy dla nazw typów za pomocą instrukcji typedef. Nazwy tak zdefiniowanych typów czy aliasów należeć będą do zasięgu klasy: można się do nich odwołać z zewnątrz poprzez nazwę kwalifikowaną z zastosowaniem operatora zasięgu ' ::'.

Definicję klasy piszemy zwykle na zewnątrz innych klas i funkcji (nie jest to jednak wymaganie języka: można, choć rzadko bywa to przydatne, definiować klasę wewnątrz funkcji).

Sama definicja ma postać

       class Klasa {
           // ... pola, metody...
       };
lub
       struct Klasa {
           // ... pola, metody...
       };
Nie należy zapominać o średniku kończącym definicję klasy! Nowy typ jest już zdefiniowany po napotkaniu zamykającego nawiasu klamrowego, zatem za nawiasem, a przed średnikiem można umieścić definicje obiektów właśnie zdefiniowanej klasy; na przykład po
       struct Klasa {
           // ...
       } x, y, z;
zdefiniowana byłaby klasa Klasa i utworzone trzy obiekty tej klasy o nazwach x, yz (pod warunkiem, że istnieje w klasie/strukturze publiczny konstruktor domyślny, co za chwilę omówimy bardziej szczegółowo).

T.R. Werner, 23 lutego 2019; 23:59