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

Klasa a struktura

Object Storage Arubacloud
0 głosów
1,346 wizyt
pytanie zadane 8 września 2016 w C i C++ przez Tadeusz Jasińska Nowicjusz (190 p.)
Hej,
zaczynam kontakt z programowanie obiektowym i mam juz doswiadczenie z jezykami akimi jak Pascal, C.

Czy obiekt jest tym samym co Struct w C ?

4 odpowiedzi

0 głosów
odpowiedź 8 września 2016 przez mbabane Szeryf (79,280 p.)
nie
1
komentarz 9 września 2016 przez mbabane Szeryf (79,280 p.)

heh minus i zgloszenie - co to za trol?

udzileilem odpowiedzi na zadane pytanie - "Czy obiekt jest tym samym co Struct w C ?" - w dodatku moja odpowiedz jest poprawna, aczkolwiek nie wyczerpujaca tematu. 

Po za tym jesli juz to pytajacy powienen dostac zgloszenie bo na takie pytanie mozna znalezc odpowiedz w kilku tutorialach, szukajac informacji na temat obiektow/klas w cpp bo co to jest struct pytajacy zdaje sie ze wie, wiec czytajac co to jest klasa powienen bez trudu zauwazyc ze sa to dwie osobne rzeczy.

0 głosów
odpowiedź 9 września 2016 przez NaviFox Dyskutant (8,950 p.)
Programowanie obiektowe w C https://www.cs.rit.edu/~ats/books/ooc.pdf
0 głosów
odpowiedź 9 września 2016 przez MetRiko Nałogowiec (37,110 p.)
edycja 9 września 2016 przez MetRiko

Klasy (class) od struktur (struct) różnią się tylko jedną rzeczą.. 
Warto jednak najpierw wiedzieć, że w klasach (jak i strukturach) możliwe jest ustawienie "poziomu dostępu" do zmiennych/metod w nich zawartych.
W strukturach poziom dostępności domyślnie ustawiony jest na publiczny (public), a w klasach na prywatny (private).
Jak to działa.. i czym jest poziom dostępności warto wyjaśnić na przykładzie.. ale najpierw objaśnienie:

public - dostęp publiczny.. mając instancję jakiejś klasy możemy odwołać się bezpośrednio do jej zmiennych/metod typu public (bez używania dodatkowych funkcji.. tj. setterów/getterów*).
*Getter to metoda zwracająca wartość danej zmiennej, natomiast setter to metoda umożliwiająca ustawienie wartości zmiennej wewnątrz jakiejś klasy. (np. int Var=Object.Get_A(); lub Object.Set_A(10);)
private - dostęp prywatny.. do zmiennych/metod możemy się dostać tylko przy użyciu getterów/setterów.. bądź bezpośrednio w metodach danej klasy.
protected - dostęp chroniony.. w przypadku instancji jakiejś klasy do zmiennych/metod obiektu możemy dostać się tylko po przez gettery/settery.. jednak w porównaniu do private.. dostęp możliwy jest również w klasach dziedziczących. Innymi słowy.. jeżeli w klasie bazowej znajduje się zmienna A o poziomie dostępu = protected.. w klasie dziedziczącej możemy się do zmiennej A odwołać w metodach tej klasy. Gdyby zmienna A miała poziom dostępności = private to w klasie dziedziczącej nie moglibyśmy już się do zmiennej A odwołać bezpośrednio w ciele metod (a jedynie przez gettery/settery).

A teraz prosty przykład:
class Base
{
private:
//Tutaj domyślnie jest ustawiony poziom dostępności na private (to jest klasa, a nie struktura).. tak więc tą linijkę można usunąć bez przeszkód
    int A;
protected:
    int B;
public:
    int C;

}
class Heir : public Base
//Klasa Heir dziedziczy z klasy Base.. klasa Base jest klasą bazową.
{
//Aby do metod poniżej można było się dostać po przez instancję klasy Heir należy je "upublicznić"/ustawić ich poziom dostępności na public
public:
    void SetA(int Val){A=Val;} //Błąd kompilacji.. zmienna A jest jest prywatna.. a więc dostęp do niej nie przechodzi przy dziedziczeniu
    void SetB(int Val){B=Val;} //Tu jest ok, zmienna B jest typu chronionego.. dostęp do niej przechodzi przy dziedziczeniu
    void SetC(int Val){C=Val;} //Tutaj również wszystko w porządku, zmienna C jest typu publicznego.. dostęp do niej jest możliwy zarówno przez instancję klasy Heir jak również wewnątrz tej klasy (w jej metodach)
}

int main()
{
   Heir Obj;
//Tworzenie instancji klasy Heir
   Obj.A=10; //Błąd kompilacji.. Zmienna A jest typu private.. nie można się dostać do niej przez instancję klasy Heir
   Obj.B=20; //Błąd kompilacji.. Zmienna B jest typu protected tak więc dostęp do niej (jak w przypadku private) jest niemożliwy przez instancję klasy
   Obj.C=30; //Tutaj jest ok.. Zmienna C jest typu public.. czyli dostęp do niej jest możliwy zarówno przez metody w klasie jak i bezpośrednio przez instancję tej klasy
   Obj.SetA(10);
   Obj.SetB(20);
   Obj.SetC(30);

}

komentarz 9 września 2016 przez draghan VIP (106,230 p.)

Klasy (class) od struktur (struct) różnią się tylko jedną rzeczą..  
W klasach C++'owych możliwe jest dodatkowo ustawienie "poziomu dostępu" do danych zmiennych/metod w niej zawartych. 
W strukturach poziom dostępności domyślnie ustawiony jest na publiczny (public).. i niemożliwa jest jego zmiana. 
W klasach natomiast poziom dostępności jest domyślnie ustawiony na private (prywatny).. ale możliwa jest jego zmiana. 

Popraw post, bo to nieprawda.

struct Foo
{
    Foo(int x = 0): x{x} {}
    int f() { return x; }
private:
    int x;
};


int main()
{
    Foo bar{15};
    return bar.f();
}

 

komentarz 9 września 2016 przez MetRiko Nałogowiec (37,110 p.)
Masz rację.. Prawdopodobnie napisałem tak z pośpiechu.
Już poprawiłem.
Dzięki za zwrócenie uwagi x)
–2 głosów
odpowiedź 8 września 2016 przez Benek Szeryf (91,010 p.)
edycja 9 września 2016 przez Benek

Czy obiekt jest tym samym co Struct w C ?

Obiekt jest instancją klasy, a struct to słowo kluczowe. Tobie zapewne chodzi o różnicę między strukturą a klasą. Różnica więc jest, w skrócie mówiąc, klasa może mieć pola i metody (funkcje), a struktura same pola.

EDIT:

Ponieważ nie wszyscy chyba zrozumieli sens mojej wypowiedzi, to piszę o różnicy między strukturą w C (nie w C++) a klasą w C++, bo o to pytał użytkownik.

komentarz 8 września 2016 przez adrian17 Ekspert (344,860 p.)

Różnica więc jest, w skrócie mówiąc, klasa może mieć pola i metody (funkcje), a struktura same pola.

Głupoty.

W C nie ma klas.

W C++ie klasy i struktury to praktycznie to samo i można z nimi zrobić to samo - różnią się tylko domyślnym poziomem dostępu.

komentarz 8 września 2016 przez Pac Plus Mądrala (5,560 p.)
Dobrze, że ktoś to sprostował C:. Struktura ma domyślnie poziom "public" za to klasa "private". Najczęściej struktury jednak używam gdy myślę wyłącznię o poziomie dostępu public, ale nie jest to regułą.
komentarz 8 września 2016 przez Benek Szeryf (91,010 p.)
A gdzie ja napisałem, że w C są klasy? Zresztą kolega o to pytał, czy jest różnica między obiektem (a ten może tylko być w C++) a strukturą znaną z C. Wczytaj się dokładnie w pytanie Tadeusza, bo w tym momencie to Twoja odpowiedź jest błędna - nie moja. Podobno tutaj są ścisłowcy.
komentarz 8 września 2016 przez adrian17 Ekspert (344,860 p.)

A gdzie ja napisałem, że w C są klasy?

Nigdzie, tu było OK, chciałem tylko doisać dla ścisłości.

(lekko upraszczjąc) Z punktu widzenia C obiekt jest instancją typu, na przykład typu struktury. W C++ie obiekt jest instancją typu, na przykład typu struct/class.

Prosta odpowiedź na oryginalne pytanie brzmi: tak, C++owe klasy/struktury to to samo co struktury z C, ale można z nimi robić więcej, np. definiować metody.

komentarz 9 września 2016 przez Surykat Stary wyjadacz (14,780 p.)
Nie jestem pewien, ale w C#, struktury trzyma się na stosie, a obiekty na stercie- w C++ jest tak samo?
komentarz 9 września 2016 przez criss Mędrzec (172,590 p.)
Adrian już ci napisał jaka jest różnica. W strukturach domyślne jest public, a w klasach private. To wszystko - nie ma żadnych innych różnic. A to czy są trzymane na stercie czy na stosie oraz czy są kopiowane czy przekazywane do funkcji oryginalne definiujesz sam (odpowiednio: alokując dynamicznie i (nie)używając referencji).
komentarz 9 września 2016 przez Benek Szeryf (91,010 p.)

@adrian17:

Prosta odpowiedź na oryginalne pytanie brzmi: tak, C++owe klasy/struktury to to samo co struktury z C, ale można z nimi robić więcej, np. definiować metody.

 To właśnie napisaliśmy to samo:

 Tobie zapewne chodzi o różnicę między strukturą a klasą. Różnica więc jest, w skrócie mówiąc, klasa może mieć pola i metody (funkcje), a struktura same pola.

Ale dzięki Twojemu:

Głupoty.

Ludzie odrzucają moją odpowiedź, choć twierdzimy to samo. 

komentarz 9 września 2016 przez adrian17 Ekspert (344,860 p.)

Nie napisaliśmy tego samego.

a struktura same pola.

Jeśli miałeś na myśli struktury z C, to prawda.

Jeśli miałeś na myśli struktury z C++, to nieprawda.

Problem w tym, że z kontekstu tego zdania założyłem (i było ryzyko że inni też tak założą) że mówisz o C++ie.

komentarz 9 września 2016 przez Benek Szeryf (91,010 p.)

Tadeusz pytał o:

Czy obiekt jest tym samym co Struct w C ?

więc mówimy o C (nie C++). Dodatkowo napisał, że ma doświadczenie z językami takimi jak Pascal i C.

Problem w tym, że z kontekstu tego zdania założyłem (i było ryzyko że inni też tak założą) że mówisz o C++ie.

No właśnie, a że masz dobrą reputację, to dla innych się to liczy. Miałem nadzieję, że na forum programistycznym będzie mniej ludzi ulegających emocjom :)

Podobne pytania

+1 głos
3 odpowiedzi 247 wizyt
+1 głos
1 odpowiedź 414 wizyt
0 głosów
2 odpowiedzi 266 wizyt
pytanie zadane 23 lutego 2016 w C i C++ przez niezalogowany

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...