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

Klasa a struktura

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
1,609 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,260 p.)
nie
1
komentarz 9 września 2016 przez mbabane Szeryf (79,260 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 (92,810 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 Mentor (350,120 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 (92,810 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 Mentor (350,120 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 (92,810 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 Mentor (350,120 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 (92,810 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 293 wizyt
+1 głos
1 odpowiedź 544 wizyt
0 głosów
2 odpowiedzi 314 wizyt
pytanie zadane 23 lutego 2016 w C i C++ przez niezalogowany

93,096 zapytań

142,059 odpowiedzi

321,514 komentarzy

62,441 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...