1. Programowanie zorientowane obiektowo a języki zorientowane obiektowo?
Pojęcie "zorientowany obiektowo" jest zarezerwowane dla techniki programowania. Język może być co najwyżej "obiektowy". Pisanie kodu tą techniką jest często określane skrótem OOP — ang. Object Oriented Programming.
Jest kilka poziomów korzystania z obiektowości. To, że tworzysz klasy w swoim programie, to nie znaczy, że piszesz techniką OOP i najczęściej tak nie jest! Wyróżnia się też programowanie bazujące na obiektach. Czyli masz klasy, ale nie komunikują się one ze sobą samodzielnie. Ręcznie wywołujesz ich metody w jakichś funkcjach.
A języki obiektowe, to po prostu języki programowania, które obsługują obiektowość :-)
Nie wszystkie jednakowe. W C++ można zrobić z klasami kilka rzeczy, których w Java lub C# już nie wykonasz.
2. Czy można programować obiektowo w językach niezorientowanych obiektowo?
Jak kolega jpacanowski wspomniał, można to zrobić, aczkolwiek mooocno naciągane. To tak jakby zapytać: czy można wypłynąć tratwą na otwarte morze... Oczywiście, że można! Pod warunkiem, że ręcznie dobudujesz do niej solidny kadłub!
3. Jak to jest z pamięcią? Jak zmienne wyglądają w pamięci? Jak tablice wyglądają w pamięci?
Jak tablice wyglądają w pamięci już kolega wysłał, to ja może opowiem jak wyglądają w pamięci... nasze własne klasy i struktury, a co! Od wiedzy nikt jeszcze nigdy nie umarł.... Nie, Curie zabiło promieniowanie, nie nauka :D
Rozmieszczenie klas i struktur w pamięci w dużej mierze zależy od kompilatora. Jeśli nie bawiłeś się w ustawieniach kompilatora, to najprawdopodobniej w pamięci działa to na bardzo podobnej zasadzie jak tablica. Jeśli nasza klasa czy struktura posiada jakieś zmienne składowe, to układane są one w pamięci obok siebie (w celu przyspieszenia odczytu). Nie można jednak (podobnie jak w przypadku tablic) obok siebie umieścić int double int, bo inny rozmiar zajmuje int a inny double. Kompilator ucieka się więc do sztuczki. Jeśli mam przynajmniej jedną zmienną zajmującą 4 bajty, to wszystkie zmienne, które zajmują mniej, automatycznie też będą zapisane też na 4 bajtach.
Można to porównać do sytuacji. Chcesz sobie stworzyć tablicę, w której musisz zapisać: int int int oraz long . Ale przecież tablica musi być jednego typu! Wobec czego musisz pójść na kompromis i kosztem większej pamięci zadeklarować całą tablicę na te 4 elementy jako long.
Na potwierdzenie moich słów wysyłam kod, wraz z tym co u mnie zostało wyświetlone.
#include <iostream>
using namespace std;
struct Str
{
int a;
double b;
int c;
};
int main()
{
Str S;
int * w1 = &S.a;
double * w2 = &S.b;
int * w3 = &S.c;
cout << (int)w1 << endl;
cout << (int)w2 << endl;
cout << (int)w3 << endl;
cout << "------------" << endl;
cout << "a " << sizeof( S.a ) << endl;
cout << "b " << sizeof( S.b ) << endl;
cout << "c " << sizeof( S.c ) << endl;
cout << "struktura " << sizeof( S ) << endl;
return 0;
}
Wyjście z programu:
1636988
1636996
1637004
------------
a 4
b 8
c 4
struktura 24
Zauważ, że:
a) adresy 3 zmiennych występują obok siebie w odległości co 8 bajtów (tyle zajmuje double)
b) pomimo tego, że poszczególne 3 elementy struktury zajmują kolejno: 4 + 8 + 4 = 18 bajtów, to cała struktura waży 24 bajty. To dlatego, że te inty zostały zapisane na 8 bajtach, a nie 4.
Pozdrawiam :-)