Различие между структурами и классами в C ++

Какое различие есть в C ++ между структурой и классом? Согласно которому я понимаю, структура - форма в c ++ создания объекта, также как и в python он используется class.

3
задан 02.12.2016, 16:27
3 ответа

Единственное различие между class и struct это видимость Ваших членов, будучи членами struct назначенная по умолчанию публика в то время как публика class они лишены по умолчанию.

Препятствуя этому различию, оба сооружения равны:

Оба могут быть использованными в наследстве

struct A {};
class B {};

struct C : public A, public B {};
class D : public A, public B {};

Это подразумевает, что также у обоих могут быть виртуальные, виртуальные чистые функции, sobreescribir функции и использовать любой уровень наследства.

У обоих могут быть публичные, защищенные и частные члены

struct S
{
    int publico; // miembro publico.
protected:
    int protegido; // miembro protegido.
private:
    int privado; // miembro privado.
};
class C
{
    int privado; // miembro privado.
protected:
    int protegido; // miembro protegido.
public:
    int publico; // miembro publico.
};

Оба авто-производят специальные функции

В обоих случаях, если он не определится ясно, он будет создан автоматически:

  • Назначенный по умолчанию строитель.
  • Строитель копии.
  • Строитель движения.
  • Оператор копии - ассигнования.
  • Разрушитель.

Оба могут быть пред-очевидными

struct S; // pre-declaracion de S
class C; // pre-declaracion de C

struct S { int i; }; // declaracion de S
class C { int i; }; // declaracion de C

Он хотел упомянуть об этой точке, потому что возможно пред-объявлять объект как class и после объявлять это как struct (и наоборот); большинство составителей это принимает, хотя они обычно показывают тревогу.

У обоих есть та же структура в памяти

Класс и структура с теми же членами в том же порядке, займут то же самое в памяти и у них будут те же padding между членами.

struct S { char c; short s; int i; float f; double d; };
class C { char c; short s; int i; float f; double d; };

static_assert(sizeof(S) == sizeof(C)); // Verdadero!
6
ответ дан 24.11.2019, 12:18
  • 1
    Wow, - почти то же самое только различаются в видимости членов, но и Союзе? они похожие также или различные в чем-то? – Malthael 02.12.2016, 20:08
  • 2
    Тогда, ¿ не имей значения, как он сделал объект, если с struct или class? ¿ Я буду получать те же результаты? – Jogofus 04.12.2016, 15:31
  • 3
    @Jogofus завись, в котором ты разобрался из-за " тех же результатов " кроме из-за назначенной по умолчанию видимости членов, struct или class actú an того же способа. – PaperBirdMaster 05.12.2016, 09:51

В C ++ struct и class они - практически то же самое, с единственным различием, чем в одной struct назначенные по умолчанию члены публичные и в одной class по умолчанию они частные.

Одна struct смоги содержать то же самое что одна class, методы, строители, разрушители, наследство.

1
ответ дан 24.11.2019, 12:18

Помимо упомянутого в других ответах на теме видимости (тема, на которой я не буду комментировать, потому что уже он очень документировался в других ответах) есть второе различие между использованием struct и class и он в случае template:

class возможно использовать, чтобы объявлять типы для одного template, в то время как struct нет:

// ok
template<class T>
void func1(T t)
{ std::cout << t << '\n'; }

// ok
template<typename T>
void func2(T t)
{ std::cout << t << '\n'; }


// error
template<struct T>
void func3(T t)
{ std::cout << t << '\n'; }
1
ответ дан 24.11.2019, 12:18
  • 1
    Я не уверен в 100 %, но думаю, что он проистекает из различий semá nticas того же слова, размещенного в различных контекстах... а именно: class внутри template не значит то же самое, что и class, чтобы объявлять объекты ergo, aú n будучи тем же ключевым словом: они не то же самое. – PaperBirdMaster 02.12.2016, 13:01
  • 2
    @PaperBirdMaster, Использовать class, чтобы определять типы в одном, сдержись он не подразумевает ни для чего, что этот тип был должен специализироваться с классом..., возможно настраивать с int и он ничего не перемещает. Но оно не прекращает быть различием между обоими словами внутри C ++ – eferion 02.12.2016, 13:03
  • 3
    Использование class в контексте pará метр шаблон - по причинам histó богатые: не querí чтобы создавать другое ключевое слово (что в конце концов creó: typename). Значение class внутри шаблона отличается в тот class вне этого контекста, así так как: это различные ключевые слова homó nimas. – PaperBirdMaster 02.12.2016, 13:44
  • 4
    @PAAperBirdMaster вопрос идет различий между struct и class. Я не вижу, что был определен определенный контекст, потом не вижу, что ответ esté вне места – eferion 02.12.2016, 13:52
  • 5
    Я понимаю, что вопрос идет различий между объектами struct и class, не между значениями обоих ключевых слов... в любом случае не сказал, что ответ esté вне места, если не, что class в контексте объекта и контексте шаблона не то же самое. – PaperBirdMaster 02.12.2016, 14:59