• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Programowanie obiektowe c++

Object Storage Arubacloud
+2 głosów
780 wizyt
pytanie zadane 4 kwietnia 2016 w C i C++ przez caramelleandamour Użytkownik (550 p.)
  • Programowanie zorientowane obiektowo a języki zorientowane obiektowo?
  • Czy można programować obiektowo w językach niezorientowanych obiektowo?
  • Jak to jest z pamięcią? Jak zmienne wyglądają w pamięci? Jak tablice wyglądają w pamięci?

2 odpowiedzi

+2 głosów
odpowiedź 5 kwietnia 2016 przez Sebastian Fojcik Nałogowiec (43,040 p.)
wybrane 6 kwietnia 2016 przez caramelleandamour
 
Najlepsza

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 :-)

komentarz 5 kwietnia 2016 przez ZakosiliMiNeta Nałogowiec (30,870 p.)

 W C++ można zrobić z klasami kilka rzeczy, których w Java lub C# już nie wykonasz.

Można prosić o przykład prócz definiowania własnych operatorów ? 

komentarz 5 kwietnia 2016 przez Sebastian Fojcik Nałogowiec (43,040 p.)

Pierwsza rzecz jaka mi teraz przychodzi do głowy, to dziedziczenie z kilku klas jednocześnie. Niewykonalne w C# i Java.

Oczywiście spryciarze zawsze znajdą sposób, aby to "ominąć", aczkolwiek to tylko zwykłe sztuczki. Oficjalnie można dziedziczyć z jednej klasy i koniec.

komentarz 5 kwietnia 2016 przez Boshi VIP (100,240 p.)
Po to ludzie wymyślili interfejsy. Nie wspominając o tym, że takie dziedziczenie sprawia więcej problemów jak ma zalet...
komentarz 5 kwietnia 2016 przez Sebastian Fojcik Nałogowiec (43,040 p.)
To nie jest czas i miejsce na rozstrzyganie czy to sprawia problemy, czy nie. Stwierdziłem tylko, że w tych językach takie dziedziczenie jest nieobsługiwane. Posługiwanie się interfejsem, to już inna sprawa.
komentarz 5 kwietnia 2016 przez ZakosiliMiNeta Nałogowiec (30,870 p.)
Wszystko w programowaniu ma swoje uzasadnione miejsce
+2 głosów
odpowiedź 4 kwietnia 2016 przez jpacanowski VIP (101,940 p.)
  • Czy można programować obiektowo w językach niezorientowanych obiektowo?

Trochę naginane, ale tak, jest to możliwe...
http://kaczus.ppa.pl/art/c_obiektowo,3.html

  • Jak to jest z pamięcią? Jak zmienne wyglądają w pamięci? Jak tablice wyglądają w pamięci?

http://grafika.weii.tu.koszalin.pl/c/w11.pdf 

komentarz 4 kwietnia 2016 przez caramelleandamour Użytkownik (550 p.)
Dziękuję za pomoc :)

Podobne pytania

0 głosów
2 odpowiedzi 279 wizyt
0 głosów
1 odpowiedź 414 wizyt
0 głosów
1 odpowiedź 451 wizyt

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...