Jakie są różnice między strukturą a klasą w C++?

To pytanie było już zadawane w kontekście C#/. Net.

Teraz chciałbym poznać różnice między strukturą a klasą w C++. Prosimy o omówienie różnic technicznych oraz powodów wyboru jednego lub drugiego w projekcie OO.

Zacznę od oczywistej różnicy:

  • Jeśli nie podasz public: LUB private:, członkowie struktury są domyślnie publiczne; Członkowie klasy są domyślnie prywatni.

I ' m oczywiście istnieją inne różnice, które można znaleźć w niejasnych narożnikach specyfikacji C++.

Author: Community, 2008-09-18

30 answers

Zapominasz o trudnej drugiej różnicy między klasami a strukturami.

Quote the standard (§11.2.2 in C++98 through C++11):

W przypadku braku access-specifier dla klasy bazowej przyjmuje się, że public gdy deklarowana jest klasa pochodna struct i private są zakładane, gdy klasa jest zadeklarowana class .

I dla kompletności, szerzej znana różnica między klasą A strukturą jest zdefiniowana w (11.2):

Członek klasy zdefiniowanej za pomocą keyword class are private by default. Członkowie określonej klasy ze słowami kluczowymi struct lub union domyślnie są publiczne .

Dodatkowa różnica: słowo kluczowe class może być użyte do zadeklarowania parametrów szablonu, podczas gdy słowo kluczowe struct nie może być tak użyte.

 476
Author: Assaf Lavie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-03 04:03:08

Cytowanie C++ FAQ ,

[7.8] Jaka jest różnica między słowa kluczowe struct I class?

Członkowie i klasy bazowe a struct są domyślnie publiczne, podczas gdy w Klasa, domyślnie prywatna. Uwaga: powinieneś zrobić swoje klasy bazowe jawnie publiczne, prywatne lub chronione, zamiast polegać na domyślne.

Struct i klasa są inaczej funkcjonalnie równoważne.

Ok, dość tego piszczącego czyste techno talk. Emocjonalnie, najbardziej deweloperzy mocno wyróżniają między klasą A strukturą. A struct po prostu czuje się jak otwarty stos bitów z bardzo małą ilością na drodze hermetyzacja lub funkcjonalność. A Klasa czuje się jak żywa i odpowiedzialny członek społeczeństwa z inteligentne usługi, silny bariera hermetyczna, oraz studnia zdefiniowany interfejs. Ponieważ to konotacji większość ludzi ma już, prawdopodobnie powinieneś użyć struktury słowo kluczowe if masz klasę, która ma bardzo mało metod i ma publiczne dane (takie rzeczy istnieją w dobrze zaprojektowanych systemy!), ale poza tym należy prawdopodobnie używasz słowa kluczowego class.

 164
Author: Robᵩ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-17 17:56:16

Warto pamiętać o pochodzeniu C++i kompatybilności z C.

C ma struktury, nie ma pojęcia enkapsulacji, więc wszystko jest publiczne.

Bycie publicznym domyślnie jest ogólnie uważane za zły pomysł przy podejściu zorientowanym obiektowo, więc w tworzeniu formy C, która jest natywnie sprzyjająca OOP (możesz zrobić oo W C, ale to Ci nie pomoże), co było pomysłem w C++ (pierwotnie "C With Classes"), ma sens, aby członkowie byli prywatni domyślnie.

On z drugiej strony, gdyby Stroustrup zmienił semantykę struct tak, że jego członkowie byli domyślnie prywatni, to złamałby kompatybilność (nie jest to już tak często prawdziwe, jak standardy się różniły, ale wszystkie poprawne programy C były również poprawnymi programami c++, co miało duży wpływ na nadanie C++ przyczółka).

Wprowadzono więc nowe słowo kluczowe class, które jest dokładnie takie jak struktura, ale domyślnie jest prywatne.

Gdyby C++ powstało od podstaw, bez historii, to prawdopodobnie tylko jedno takie słowo kluczowe. Prawdopodobnie nie wywarłoby to takiego wpływu.

Ogólnie rzecz biorąc, ludzie mają tendencję do używania struct, gdy robią coś takiego, jak to, jak struktury są używane w C; członkowie publiczni, bez konstruktora (tak długo, jak nie jest on w Unii, ty możesz mieć konstruktory w strukturach, tak jak w klasach, ale ludzie mają tendencję do tego), bez metod wirtualnych itp. Ponieważ języki są tak samo do komunikowania się z ludźmi czytającymi Kod, jak do instruowania maszyn (inaczej trzymalibyśmy z kodami assembly i surowymi opcodami VM) warto się przy tym trzymać.

 127
Author: Jon Hanna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-10 02:06:38

Członkowie klasy są domyślnie prywatni. Domyślnie członkowie Struct są publiczni. Poza tym nie ma innych różnic. Zobacz też to pytanie .

 34
Author: Kasprzol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:29

Według Stroustrupa w języku programowania C++ :

Jaki styl używasz zależy od okoliczności i smaku. Zazwyczaj wolę używać struct dla klas, które mają wszystkie dane publiczne. Myślę o takich klasach jak " nie całkiem odpowiednie typy, tylko struktury danych."

Funkcjonalnie, nie ma innej różnicy niż publiczne / prywatne

 28
Author: crashmstr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 14:15:12

1) Członkowie klasy są domyślnie prywatni, a członkowie struktury są domyślnie publiczni.

Na przykĹ 'ad program 1 zawodzi w kompilacji, a program 2 dziaĹ' a dobrze.

// Program 1
#include <stdio.h>

class Test {
    int x; // x is private
};
int main()
{
  Test t;
  t.x = 20; // compiler error because x is private
  getchar();
  return 0;
}
Run on IDE
// Program 2
#include <stdio.h>

struct Test {
    int x; // x is public
};
int main()
{
  Test t;
  t.x = 20; // works fine because x is public
  getchar();
  return 0;
}

2) podczas wyprowadzania struktury z klasy / struktury, domyślnym określnikiem dostępu dla klasy / struktury bazowej jest public. Podczas wyprowadzania klasy domyślnym określnikiem dostępu jest prywatny.

Na przykĹ 'ad program 3 nie powiodĺ' siÄ ™ w kompilacji, a program 4 dziaĹ ' a poprawnie.

// Program 3
#include <stdio.h>

class Base {
public:
    int x;
};

class Derived : Base { }; // is equilalent to class Derived : private Base {}

int main()
{
  Derived d;
  d.x = 20; // compiler error becuase inheritance is private
  getchar();
  return 0;
}
Run on IDE
// Program 4
#include <stdio.h>

class Base {
public:
    int x;
};

struct Derived : Base { }; // is equilalent to struct Derived : public Base {}

int main()
{
  Derived d;
  d.x = 20; // works fine becuase inheritance is public
  getchar();
  return 0;
}
 11
Author: Suraj K Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-07 03:47:26

STRUCT jest typem abstrakcyjnego typu danych, który dzieli dany fragment pamięci zgodnie ze specyfikacją struktury. Struktury są szczególnie przydatne w serializacji/deserializacji plików, ponieważ struktura często może być zapisana do pliku dosłownie. (tzn. uzyskaj wskaźnik do struktury, użyj makra SIZE, aby obliczyć liczbę bajtów do skopiowania, a następnie przenieś dane do struktury lub poza nią.)

Klasy to inny typ abstrakcyjnego typu danych, który próbuje zapewnić informacje ukrywam się. Wewnętrznie może istnieć wiele machinacji, metod, zmiennych temp, zmiennych stanu. itd. które są używane do prezentacji spójnego API dla dowolnego kodu, który chce używać klasy.

W efekcie, struktury dotyczą danych, a klasy kodu.

Musisz jednak zrozumieć, że są to jedynie abstrakcje. Jest całkowicie możliwe tworzenie struktur, które wyglądają podobnie do klas i klas, które wyglądają podobnie do struktur. W rzeczywistości najwcześniejsze kompilatory C++ były tylko Pre-kompilatorami, które przekładają kod C++ na C. Tak więc te abstrakcje są korzyścią dla logicznego myślenia, niekoniecznie atutem dla samego komputera.

Poza tym, że każda z nich jest innym rodzajem abstrakcji, klasy dostarczają rozwiązania zagadki nazewnictwa kodu C. Ponieważ nie można wystawiać więcej niż jednej funkcji o tej samej nazwie, Programiści stosowali wzorzec _(). np. mathlibextreme_max(). Grupując API w klasy, podobne funkcje (tutaj nazywamy ich "metody") mogą być grupowane razem i chronione przed nazywaniem metod w innych klasach. Pozwala to programiście lepiej zorganizować swój kod i zwiększyć ponowne użycie kodu. Przynajmniej teoretycznie.

 10
Author: 64BitBob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 14:23:30

Jedyną inną różnicą jest domyślne dziedziczenie klas i struktur, które, co nie dziwi, są odpowiednio prywatne i publiczne.

 8
Author: Skizz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 13:11:17

Różnica między class i struct jest różnicą między słowami kluczowymi, a nie między typami danych. This two

struct foo : foo_base { int x;};
class bar : bar_base { int x; };

Obie definiują typ klasy. Różnicą słów kluczowych w tym kontekście jest inny dostęp domyślny:

  • foo::x jest publiczne i foo_base jest dziedziczone publicznie
  • bar::x jest prywatna i bar_base jest dziedziczona prywatnie
 6
Author: largest_prime_is_463035818,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-19 20:35:59
  1. członkowie struktury są domyślnie publiczne, Członkowie klasy są domyślnie prywatne.
  2. domyślne dziedziczenie struktury z innej struktury lub klasy jest publiczne.Domyślne dziedziczenie klasy z innej struktury lub klasy jest prywatne.
class A{    
public:    
    int i;      
};

class A2:A{    
};

struct A3:A{    
};


struct abc{    
    int i;
};

struct abc2:abc{    
};

class abc3:abc{
};


int _tmain(int argc, _TCHAR* argv[])
{    
    abc2 objabc;
    objabc.i = 10;

    A3 ob;
    ob.i = 10;

    //A2 obja; //privately inherited
    //obja.i = 10;

    //abc3 obss;
    //obss.i = 10;
}

To jest na VS2005.

 5
Author: melpomene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-03 04:52:21
  1. Składnikami klasy zdefiniowanymi słowem kluczowym class są domyślnie private. Członkowie klasy zdefiniowanej za pomocą słów kluczowych struct (lub union) są domyślnie public.

  2. W przypadku braku specyfikacji dostępu dla klasy bazowej, przyjmuje się public, gdy deklarowana jest klasa pochodna, A private, gdy deklarowana jest klasa class.

  3. Możesz zadeklarować enum class, ale nie enum struct.

  4. Możesz użyć template<class T>, ale nie template<struct T>.

Zauważ również, że standard C++ pozwala na zadeklarowanie typu forward-declare jako struct, a następnie użycie class podczas deklarowania typu i vice-versa. Ponadto, std::is_class<Y>::value jest true dla Y jest struct i class, ale jest false dla enum class.

 5
Author: Bathsheba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-19 14:00:23

Nie w specyfikacji, nie. Główna różnica polega na oczekiwaniach programistów, którzy odczytają Twój kod w ciągu 2 lat. struktury są często zakładane jako POD. Struktury są również używane w metaprogramowaniu szablonów, gdy definiujesz typ do celów innych niż definiowanie obiektów.

 4
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 14:15:11

Jeszcze jedno, jeśli zaktualizowałeś starszą aplikację, która miała struktury do używania klas, możesz napotkać następujący problem:

Stary kod ma struktury, kod został wyczyszczony, a te zmienione na klasy. Wirtualna funkcja lub dwie zostały następnie dodane do nowej zaktualizowanej klasy.

Gdy funkcje wirtualne są w klasach, wtedy wewnętrznie kompilator doda dodatkowy wskaźnik do danych klasy, aby wskazać na funkcje.

Jak to złamie stary kod legacy, jeśli w starym kodzie gdzieś struktura została wyczyszczona za pomocą memfill, aby wyczyścić wszystko do zer, to mogłoby również zdeptać dodatkowe dane wskaźnika.

 4
Author: KPexEA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 15:31:53

Kolejna główna różnica dotyczy szablonów. Z tego, co wiem, możesz używać klasy przy definiowaniu szablonu, ale nie struktury.

template<class T> // OK
template<struct T> // ERROR, struct not allowed here
 3
Author: Stefan Popescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-12 11:21:53

Oto dobre wyjaśnienie: http://carcino.gen.nz/tech/cpp/struct_vs_class.php

Więc jeszcze raz: w C++ struktura jest identyczna z klasą, z tym wyjątkiem, że członkowie struktury domyślnie mają widoczność publiczną, ale członkowie klasy domyślnie mają widoczność prywatną.

 2
Author: nutario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 14:13:29

To tylko zjazd. Struktury mogą być tworzone w celu przechowywania prostych danych, ale później ewoluują wraz z dodaniem funkcji prętowych i konstruktorów. Z drugiej strony to niezwykłe widzieć coś innego niż publiczne: dostęp w strukturze.

 2
Author: finnw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 14:17:42

ISO IEC 14882-2003

9 klasy

§3

Struktura jest klasą zdefiniowaną przez klucz klasy struct; jego członkowie i klas bazowych (klauzula 10) są domyślnie publiczna(klauzula 11).

 2
Author: Gregory Pakosz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-18 09:18:14

Inne odpowiedzi wspominały o prywatnych / publicznych wartościach domyślnych (ale zauważ, że struktura jest klasą jest strukturą; nie są to dwa różne elementy, tylko dwa sposoby definiowania tego samego elementu).

Co może być interesujące do zauważenia (zwłaszcza, że asker może używać MSVC++, ponieważ wspomina o "niezarządzanym" C++) Jest to, że Visual C++ skarży się w pewnych okolicznościach, jeśli klasa jest zadeklarowana za pomocą class, a następnie zdefiniowana za pomocą struct (lub ewentualnie na odwrót), chociaż standard mówi, że to całkowicie legalne.

 1
Author: ymett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-04 14:25:00
  • . W klasach domyślnie wszyscy członkowie są prywatni, ale w strukturze członkowie są domyślnie publiczni.

    1. Nie ma takiego pojęcia jak konstruktor i destruktor dla struktur, ale dla kompilatora klas tworzy domyślne, jeśli nie podasz.

    2. Rozmiar pustej struktury wynosi 0 bajtów wer ponieważ wielkość pustej klasy wynosi 1 bajt domyślny typ dostępu struct jest publiczny. Struktura powinna zazwyczaj służy do grupowania danych.

    Domyślna klasa Typ dostępu jest prywatny, a domyślny tryb dla dziedziczenie jest prywatne. Klasa powinna być używana do grupowania danych i metody, które działają na tych danych.

    W skrócie, konwencją jest użycie struct, gdy celem jest grupowania danych, oraz używać klas, gdy wymagamy abstrakcji danych i, może spadek.

    W C++ struktury i klasy są przekazywane przez wartość, chyba że jawnie odwołany. W innych językach klasy i struktury mogą mieć odrębna semantyka-tj. obiekty (instancje klas) mogą być zdane przez odniesienie i struktury mogą być przekazywane przez wartość. Uwaga: są komentarze związane z tym pytaniem. Zobacz stronę dyskusji do Dodaj do rozmowy.

 1
Author: yshivakathik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-10 19:07:09

Chociaż sugerowane przez inne odpowiedzi, nie jest wyraźnie wspomniane - że struktury są kompatybilne z C, w zależności od użycia; klasy nie są.

Oznacza to, że jeśli piszesz nagłówek, który chcesz być zgodny z C, to nie masz innej opcji niż struct(która w świecie C nie może mieć funkcji; ale może mieć Wskaźniki funkcji).

 1
Author: UKMonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-29 11:38:01

Możesz wziąć to pod uwagę w wytycznych, kiedy przejść do struct lub klasy, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx .

√ rozważ zdefiniowanie struktury zamiast klasy, jeśli instancje typu są małe i zwykle krótkotrwałe lub są powszechnie osadzone w inne obiekty.

X unikaj definiowania struktury, chyba że typ ma wszystkie następujące cechy:

Logicznie przedstawia pojedynczą wartość, podobne do prymitywne typy (int, double, itp.).

MA instancję rozmiar poniżej 16 bajtów.

Jest niezmienna.

Nie będzie musiał być boxowany często.

 -1
Author: kiriloff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Klasa ma znaczenie tylko w kontekście inżynierii oprogramowania. W kontekście struktur danych i algorytmów, klasy i struktury nie różnią się aż tak bardzo. Nie ma żadnej reguły ograniczającej, że członek klasy musi być odwołany.

Podczas tworzenia dużego projektu z mnóstwem ludzi bez klasy, możesz w końcu uzyskać skomplikowany kod sprzężony, ponieważ każdy używa dowolnych funkcji i danych, które chcą. klasa zapewnia kontrolki uprawnień i dziedziczenia w celu zwiększenia oddzielenia i ponownego użycia kody.

Jeśli przeczytasz niektóre zasady inżynierii oprogramowania, przekonasz się, że większość standardów nie może być łatwo zaimplementowana bez klasy. na przykład: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

BTW, gdy struktura przydziela zapas pamięci i zawiera kilka zmiennych, zmienne typu value wskazują, że wartości są osadzone w miejscu, w którym jest alokowana struktura. Natomiast wartości zmiennej typu odniesienia są zewnętrzne, A odniesienia za pomocą wskaźnika, który jest również osadzone w miejscu, w którym przydzielana jest struct.

 -2
Author: snow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-16 16:49:09

Różnica między structA classsłowami kluczowymi w C++ polega na tym, że jeśli nie ma określonego specyfika na danym złożonym typie danych, to domyślnie structlub union to publiczne słowa kluczowe, które tylko rozważają ukrywanie danych, ale klasa jest prywatnym słowem kluczowym, które rozważa ukrywanie kodów programu lub danych. Zawsze niektórzy programiści używają struct dla danych i klasy dla kodu. Aby uzyskać więcej informacji, skontaktuj się z innymi źródłami.

 -3
Author: MOBITI MAHENGE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-15 13:57:45

Z tych wszystkich czynników można wywnioskować, że Klasa concept jest wysoce odpowiednia do reprezentowania obiektów świata rzeczywistego, a nie"struktur".W dużej mierze dlatego, że pojęcia OOP używane w klasie są bardzo praktyczne w wyjaśnianiu rzeczywistych scenariuszy, dlatego łatwiej je połączyć z rzeczywistością.Dla przykładu, domyślne dziedziczenie jest publiczne dla struktur, ale jeśli zastosujemy tę regułę dla świata rzeczywistego, jest to śmieszne.Ale w klasie domyślne dziedziczenie jest prywatne, co jest bardziej realistyczne.

Anyway, what i need to justify is Class jest o wiele szerszym pojęciem stosowanym w świecie rzeczywistym, podczas gdy struktura jest pojęciem prymitywnym o słabej organizacji wewnętrznej (nawet jeśli struct podąża za koncepcjami OOP,mają one słabe znaczenie) {]}

 -3
Author: Wageesha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-27 01:22:29

Główna różnica między słowem kluczowym structure I class w oops polega na tym, że w strukturze nie ma publicznej i prywatnej deklaracji członkowskiej.a członek danych i funkcja członka mogą być zdefiniowane jako publiczne, prywatne, a także chronione.

 -3
Author: Tushar Bobade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-28 19:50:07

**UPDATE: * * Proszę zignorować tę odpowiedź. Nie brałem pod uwagę możliwości, że dla struktury wartość była niezinicjalizowana, ale akurat była równa 0. Nie ma różnicy inicjalizacyjnej między strukturą a klasą.


Widzę kolejną różnicę pomiędzy strukturami i klasami, które mają do czynienia z domyślną inicjalizacją.

struct Foo {
    int a;
};

class Bar {
    int a;
};

class Tester {
    Foo m_Foo = Foo();
    Bar m_Bar = Bar();

public:
    Tester() {}
};

int main() {
    auto myTester = Tester();
}
Uruchom ten kod i zbadaj myTester. Znajdziesz to dla m_foo, struct, m_foo.a zostało zainicjalizowane na 0, ale dla m_Bar, Klasa, m_Bar.a jest niezinicjowane. Wydaje się więc, że istnieje różnica w tym, co domyślny konstruktor robi dla struct vs.class. Widzę to w Visual Studio.
 -3
Author: Eric Hill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-14 16:12:51

Główna różnica między strukturą a klasą polega na tym, że w struct można deklarować tylko zmienne danych różnych typów danych, podczas gdy w klasie można deklarować zmienne danych,funkcje Członkowskie, a tym samym manipulować zmiennymi danych za pomocą funkcji.

-> Kolejną przydatną rzeczą, którą znajduję w class vs struct jest to, że podczas implementacji plików w programie, jeśli chcesz wykonywać pewne operacje struktury ponownie i ponownie na każdym nowym zestawie operacji, musisz utworzyć oddzielną funkcję i musisz przekazać obiekt struct po przeczytaniu go z pliku, aby wykonać na nim pewne operacje . podczas gdy w klasie, jeśli zrobisz funkcję, która wykonuje pewne operacje na danych potrzebnych za każdym razem..to proste, wystarczy odczytać obiekt z pliku i wywołać funkcję..

Ale to zależy od programisty, który sposób uzna za odpowiedni...według mnie wolę klasy everytime tylko dlatego, że obsługuje on OOPs i dlatego jest zaimplementowany w prawie każdym języku i jego wspaniała cecha programowania wszechczasów; -)

I tak najbardziej niewybaczalną różnicą, o której zapomniałem wspomnieć, jest to, że klasa obsługuje ukrywanie danych, a także obsługuje operacje wykonywane na wbudowanych typach danych, podczas gdy struct tego nie robi !

 -4
Author: Yug Rawal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-09 15:15:07

Znalazłem inną różnicę. jeśli nie zdefiniujesz konstruktora w klasie, kompilator ją zdefiniuje. ale w strukturze, jeśli nie zdefiniujesz konstruktora, kompilator też go nie zdefiniuje. tak więc w niektórych przypadkach, gdy naprawdę nie potrzebujemy konstruktora, struct jest lepszym wyborem(wskazówka dotycząca wydajności). i przepraszam za mój zły angielski.

 -5
Author: Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-04 13:28:15

Klasy są typami odniesienia, A struktury są typami wartości.
Kiedy mówię, że klasy są typami odniesienia,
zasadniczo będą one zawierać adres zmiennych instancji.

Na przykład:

Class MyClass
{
    Public Int DataMember;  //By default, accessibility of class data members 
                            //will be private. So I am making it as Public which 
                            //can be accessed outside of the class.
}

W metodzie głównej,
Mogę utworzyć instancję tej klasy używając nowego operatora, który przydziela pamięć dla tej klasy
i zapisuje adres bazowy do zmiennej typu MyClass (_myClassObject2).

Static Public void Main (string[] arg)
{
    MyClass _myClassObject1 = new MyClass();
    _myClassObject1.DataMember = 10;

    MyClass _myClassObject2 = _myClassObject1;
    _myClassObject2.DataMember=20;
}

W powyższym programie, MyClass _myClassObject2 = _myClassObject1; instrukcja wskazuje, że obie zmienne typu MyClass

  1. myClassObject1
  2. myClassObject2

I wskaże to samo miejsce pamięci.
Zasadniczo przypisuje to samo miejsce pamięci do innej zmiennej tego samego typu.

Więc jeśli jakiekolwiek zmiany, które wprowadzimy w jednym z obiektów typu MyClass, będą miały wpływ na inny
ponieważ oba wskazują na tę samą pamięć miejsce.

" _myClassObject1.DataMember = 10;" w tej linii oba elementy danych obiektu będą zawierać wartość 10.
"_myClassObject2.DataMember = 20;" w tej linii zarówno element danych obiektu będzie zawierał wartość 20.
Ostatecznie, uzyskujemy dostęp do memberów danych obiektu za pomocą wskaźników.

W przeciwieństwie do klas, struktury są typami wartości. Na przykład:

Structure MyStructure
{
    Public Int DataMember;  //By default, accessibility of Structure data 
                            //members will be private. So I am making it as 
                            //Public which can be accessed out side of the structure.
}

Static Public void Main (string[] arg)
{
    MyStructure _myStructObject1 = new MyStructure();
    _myStructObject1.DataMember = 10;

    MyStructure _myStructObject2 = _myStructObject1;
    _myStructObject2.DataMember = 20;
}

W powyższym programie,
tworzenie instancji obiektu typu MyStructure użycie nowego operatora oraz
zapisanie adresu do zmiennej _mystructobject typu Mystruct oraz
przypisanie wartości 10 do elementu danych struktury za pomocą " _myStructObject1.DataMember = 10".

W następnym wierszu,
Deklaruję kolejną zmienną _mystructobject2 typu MyStructure i przypisuję do niej _myStructObject1.
Tutaj kompilator. Net C # tworzy kolejną kopię obiektu _myStructureObject1 i
przypisuje tę lokalizację pamięci do zmiennej MyStructure _myStructObject2.

Więc cokolwiek zmienimy na _mystructobject1 nigdy nie będzie miało wpływu na inną zmienną _mystructobject2 typu Mystrue.
Dlatego mówimy, że struktury są typami wartości.

Tak więc immediate Base class for class is Object and immediate Base class for Structure is ValueType which inherits from Object.
klasy będą wspierać dziedziczenie, podczas gdy struktury Nie.

Jak to mówimy?
A co to jest powód?
Odpowiedzią są klasy.
Może być abstrakcyjny, zapieczętowany, statyczny i częściowy, a nie może być prywatny, chroniony i chroniony wewnętrznie.
 -5
Author: Abhishek Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-16 13:56:00

Istnieją 3 podstawowe różnice między strukturą a klasą

1. - memory są zarezerwowane dla struktury w pamięci stosu (która jest blisko języka programowania), czy dla klas w pamięci stosu są zarezerwowane tylko dla zwrotności, a rzeczywista pamięć jest zarezerwowana w pamięci stosu.

2Nd-domyślnie structure treat as a public whether class treat as a private .

3Rd-nie możemy ponownie użyć kodu w strukturze, ale w klasie możemy ponownie użyć tego samego kodu w wiele razy o nazwie inhertence

 -8
Author: Naveen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-05 14:51:21