C структура распакована, в то время как C ++ структура является коробочным типом? - PullRequest
3 голосов
/ 08 февраля 2012

Как упоминалось во многих книгах, различие со структурой и классом C ++ заключается в дескрипторе контроля доступа. Поэтому мне интересно, верно ли следующее утверждение:

struct в C распакована: члены в struct явно расположены рядом с местом, где расположена структура. Но структура в C ++ является коробочным типом, подобным классу: члены / заголовки расположены где-то еще, а там, где размещена структура, содержится указатель на члены / заголовки.

Правильно ли это понимание?

И возможно ли создать в C ++ распакованный тип, который также содержит методы экземпляра?

Ответы [ 5 ]

7 голосов
/ 08 февраля 2012

Выглядит как полная чушь для меня.

Члены не волшебным образом «расположены где-то еще», никакие указатели не задействованы, а заголовки не имеют к этому никакого отношения . Компилятор C ++ даже не знает, что заголовки существуют!

3 голосов
/ 08 февраля 2012

В этом обсуждении отсутствует ключевое слово POD ( Обычная старая структура данных ). (Бокс связан с .NET и, возможно, с Java - хотя я не вспоминаю терминологию Java, используя слово)

POD в основном означает, что его можно перемещать в памяти, просто используя «биты битов» (memcpy, memmov). Существуют явные требования в стандартных спецификациях C ++.

Структуры C: всегда POD (простые старые данные), тогда как классы C ++ могут иметь «дополнительную магию», связанную с (виртуальным) наследованием.

Посмотрите на это:

Что такое типы POD в C ++?

2 голосов
/ 08 февраля 2012

C, C ++ и C # - все очень разные языки, и похоже, что вы пытаетесь думать об одном с точки зрения другого. Ваше утверждение о боксе не имеет никакого смысла в контексте C или C ++.

Смотри также:

1 голос
/ 08 февраля 2012

Нет, это совершенно неверно. Вы можете написать структуру на C ++, полностью совместимую с C, и скомпилировать код на C ++, предоставив ей интерфейс на C.

После этого вы могли бы написать программу, написанную на C, использовать структуру и вызывать функции из библиотеки, и никаких проблем не возникнет.

На самом деле многие библиотеки C ++ манипулируют структурами данных C и взаимодействуют с C.

Вы можете, хотя это и не рекомендуется, сделать это в своей структуре, и она все еще переносима на C.

struct X
{
#ifdef __cplusplus
private:
#endif
// members variables

#ifdef __cplusplus
public:
 // methods

#endif

};

но переносимо, если и только если ни одна из функций-членов не является виртуальной. Не уверен, что это именно то, что статья подразумевает под «боксом».

0 голосов
/ 08 февраля 2012

В c ++ разница между структурой и классом, как вы правильно заметили, неявный дескриптор контроля доступа. класс закрытый, а структура общедоступная.

Итак, следующее:

struct A : B
{
  int x;
};

эквивалентно:

class A : public B
{
public:
  int x;
};

Других отличий от моего понимания нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...