Typy - podział i charakterystyka


Typy mozna podzielić na:

1) Fundamentalne
a) do reprezentacji liczb całkowitych (signed, unsigned);
  int - całkowite
  short int - całkowite krótkie
  long int - całkowite długie
  enum - typ wyliczeniowy
b) do reprezentacji znaków alfanumerycznych - ascii (signed, unsigned);
  char - typ znakowy
  wchar_t - typ znakowy o rozszerzonej ilości znaków
c) do reprezentacji liczb zmiennoprzecinkowych;
  float - zmiennoprzecinkowe
  double- zmiennoprzecinkowe o podwójnej dokładności
  long double - zmiennoprzecinkowe o wydłużonej podwójnej dokładności
c) do reprezentacji obiektów logicznych;
  bool - typ logiczny
d) typ pusty;
  void - pusty, nie zwracający żadnej wartości
2) Złożone - wykorzystujące typy fundamentalne
  tablice (macierz lub wektor)
  wskaźnik
  funkcja
  referencja
3) Wbudowane - to takie, w które jest wyposażony język C++
4) Zdefiniowane przez użytkownika
  class - klasy
  ctruct - struktury
  union - unie
  pola bitowe

Poniższa tabela przypisuje typom wbudowanym, minimalne i maksymalne wartości liczbowe:

Typ

Bitów     

Zakres wartości

char
signed char
unsigned char
wchar_t

short int
signed short int
unsigned short int     
int
signed int
unsigned int
long
signed long
unsigned long

float
double
long dauble
8
8
8
16

16
16
16
32
32
32
32
32
32

32
64
80
-128 do +127
-128 do 127
 0 do 255
 0 do 65535

-32768 do 32767
-32768 do 32767
 0 do 65535
-2147483648 do 2147483647  
-2147483648 do 2147483647
 0 do 4294967295
-2147483648 do 2147483647
-2147483648 do 2147483647
 0 do 4294967295

3.4E-38 do 3.4E+38
1.7E-308 do 1.7E+308
3.4E-4932 do 3.4E+4932

Typy znakowe reprezentują znaki alfanumeryczne, które są zapisane pomiędzy dwoma apostrofami. Można także zapisywać znaki podając ich kody ASCII w zapisie szesnastkowym lub ósemkowym. Jeżeli musimy używać znaków specjalnych to musimy je poprzedzić lewym ukośnikiem. Gdy używamy typu wchar_t to dodajemy dużą literę L przed apostrofem.
Znak    

Kod zapisu    

Oznaczenie

a
a
a
a
5
\b
\f
\n
\r
\t
\v
\a
\
'
"
?
0
x=' a '
x=L' a '
x=' \x61 '
x=' \0141 '
x=' 5 '
x=' \b '
x=' \f '
x=' \n '
x=' \r '
x=' \t '
x=' \v '
x=' \a '
x=' \\ '
x=' \' '
x=' \" '
x=' \? '
x=' \0 '
litera a typu char
litera a typu wchar_t
litera a, dla pozycji podanej szesnastkowo
litera a, dla pozycji podanej ósemkowo
cyfra 5 - można stosować jako typ integer
cofanie (Backspace)
nowa strona
nowa linia
powrót karetki
tabulator poziomy
tabulator pionowy
dźwięk
lewy ukośnik
apostrof
cudzysłów
pytajnik
znak o kodzie zero (null)

Typy tekstowy (string) reprezentują znaki alfanumeryczne, które są zapisane pomiędzy dwoma cudzysłowami. Jeżeli musimy używać znaków specjalnych to musimy je poprzedzić lewym ukośnikiem. Gdy składamy string z typu wchar_t to dodajemy dużą literę L przed cudzysłowiem.
Znak    

Kod zapisu    

Oznaczenie

\b
\f
\n
\r
\t
\v
\a
\
'
"
?
0
x=" \b "
x=" \f "
x=" \n "
x=" \r "
x=" \t "
x=" \v "
x=" \a "
x=" \\ "
x=" \' "
x=" \" "
x=" \? "
x=" \0 "
cofanie (Backspace)
nowa strona
nowa linia
powrót karetki
tabulator poziomy
tabulator pionowy
dźwięk
lewy ukośnik
apostrof
cudzysłów
pytajnik
znak o kodzie zero (null)

Czas życia obiektu jest to okres od momentu przydzielenia mu miejsca w pamięci (zdefiniowania), do momentu usunięcia go z pamięci.

Zakres ważności nazwy obiektu - to ta część programu, gdzie obiekt jest dostępny przez użycie jego nazwy.
Zakres globalny jest wtedy, gdy umieścimy obiekt (zmienną), przed funkcją main. Obiekt jest wtedy dostępny w całym programie.
Jeżeli program jest podzielony na etapy realizowane przez różnych programistów, to bezpieczniej jest ukrywać nazwy obiektów przez umieszczenie ich w blokach funkcji (pomiędzy nawiasami klamrowymi). Taki obiekt jest dostępny tylko w zakresie lokalnym, przez co nie ma konfliktu nazw. Jeżeli istnieje konieczność odwołania się do zmiennej globalnej to można to zrobić używając ::nazwa_obiektu, co widać poniżej:
#include <cstdlib>;
#include <iostream>;
using namespace std;

float x=10; //zmienna globalna
int main(){
   cout<<"Podaj zmienna lokalna"<<endl;
   float x; //zmienna lokalna
   cin>>x;
   cout<<"\n\nTwoja zmienna lokalna to: "<<x;
   cout<<"\nTwoja zmienna globalna to: "<<::x<<"\n\n";
   system ("PAUSE");
   return EXIT_SUCCESS;
   }
Na ekranie zostanie wyświetlona wartość obu zmiennych. Jest to przykład na zasłanianie nazw.

Specyfikator const służy do definiowania obiektów, które nie mogą być usunięte, nawet przez nieuwagę - const float g=9.81.

Specyfikator register - mówi kompilatorowi, aby nasz obiekt został załadowany do obszaru pamięci o szybkim dostępie - register float x.

Instrukcja typedef pozwala dodawać nowe nazwy w istniejącym typie obiektów:
#include <cstdlib>;
#include <iostream>;
using namespace std;

typedef float wartosc;

int main(){
   wartosc x;
   cout<<"Podaj cene ";
   cin>>x;
   wartosc y;
   cout<<"\nPodaj cene ";
   cin>>y;
   cout<<"\n\nCena pierwsza wynosi "<<x
       <<"\n"<<"Cena druga wynosi "<<y<<"\n\n";
   system ("PAUSE");
   return EXIT_SUCCESS;
   }

Powyższy program wyświetli linie o podobnej treści:

Cena pierwsza wynosi 2
Cena druga wynosi 17

Typ wyliczeniowy enum jest stosowany w przypadkach, gdy do funkcji jest przekazywany argument w postaci liczby całkowitej. Jeżeli przy nazwie nie ma przypisanej liczby, to jest przypisywane zero.
#include <cstdlib>;
#include <iostream>;
using namespace std;

enum pomiar{
   start,
   praca=1,
   koniec=2,
   blad=3
   };
pomiar x;
int main(){
   x=start;
   cout<<"\nDo nazwy \"start\" przypisana jest liczba: "<<x;
   x=koniec;
   cout<<"\nDo nazwy \"koniec\" przypisana jest liczba: "<<x<<"\n\n";
   system ("PAUSE");
   return EXIT_SUCCESS;
   }

Powyższy program wyświetli na ekranie następujące linie:

Do nazwy "start" przypisana jest liczba: 0
Do nazwy "koniec" przypisana jest liczba: 2

do góry