В C ++, почему структура на самом деле класс? - PullRequest
6 голосов
/ 13 декабря 2010

другая тема и ответы там заставили меня задать этот вопрос:

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

Ответы [ 6 ]

7 голосов
/ 13 декабря 2010

Это позволяет более естественным образом встраивать существующие структуры в код C ++.Например, вы можете добавлять функции-члены в структуру и наследовать от структуры, что было бы невозможно, если бы структуры и классы населяли разные вселенные.

Первоначальная цель Страуструпа состояла в том, чтобы избежать разрушения сообщества междутрадиционный C-стиль "struct" camp и OO "class" толпа.Он также процитировал преимущества наличия только одной концепции вместо двух.

6 голосов
/ 13 декабря 2010

С языковой точки зрения структуры и объединения являются просто типами классов.Это упрощает спецификацию языка, если имеется меньше понятий (с маленькой буквой «c»), а также делает определение языка менее подверженным ошибкам, так как легче пропустить что-то «очевидное», если бы было прописано каждое общее свойстводля каждой из структур , объединений и неструктурных, не объединяющих классы.

Классы C ++ обладают большой потенциальной функциональностью над структурами C, но поскольку структуры C могутрассматривать как вырожденный класс C ++, проще всего позволить им быть именно таким.Нет смысла иметь специальную концепцию структура , а также концепцию класс .

Из ИСО / МЭК 14882: 2003, 9 [класс] / 4:

A структура - это класс, определенный с помощью ключа класса struct;его члены и базовые классы являются общедоступными по умолчанию. union - это класс, определенный с помощью class-key union;по умолчанию его члены являются общедоступными, и он одновременно содержит только один элемент данных.

2 голосов
/ 13 декабря 2010
  1. «публичное» значение по умолчанию для структурных полей требуется для совместимости с кодом C, который может обращаться к структурным полям.
  2. «публичное» значение по умолчанию для структурного наследования требуется, чтобы дочерний класс мог использоваться вместо базовой структуры.
  3. Можно сделать структуру в тип данных, отличный от классов (т.е. запретить спецификаторы типов доступа и методы в нем), но это было бы неудобно для программирования и добавило бы многоненужная работа для разработчиков компилятора.
1 голос
/ 13 декабря 2010

Разрешение того, что вы объявляете в качестве структуры действительно классом, обеспечивает безопасность типов при создании интерфейса C.

Вы можете заранее объявить свою структуру для интерфейса C:

struct Foo;

Вы можете объявить методы для него

void doStuffThatModifiesFoo( struct Foo * foo, ... );
struct Bar getStuffFromFoo( const struct Foo * foo );

Вы также можете написать для него методы create и destroy.

Ниже вы реализуете Foo не как структуру C, а как класс, а ваши клиенты C делают это.Не нужно это знать.Это лучше, чем передавать его как пустоту *, а затем разыгрывать (небезопасно, если кто-то передает вам пустоту * совершенно другому типу, а вы разыгрываете ее).

1 голос
/ 13 декабря 2010

В Си были только структуры для начала.Ориентация объекта началась, когда библиотеки были разработаны, когда указатели на эти структуры были переданы набору библиотечных функций, которые зависели от этой структуры.Один хороший пример - Win32 API.Это не интерфейс C ++, это интерфейс C;но он все еще объектно-ориентированный.

Классы почти такие же, как структуры в отношении памяти.Функции-члены не сохраняются как часть данных члена класса.Это просто структура с дополнительными указателями на функции в конце.Таким образом, таблица функций класса разыменовывается так же, как в Windows API используется объектная ориентация, но она инкапсулирует ее, поэтому вы ее не видите.

Наследование, полиморфизм;какая разница?Люди были в порядке с C, и все еще хорошо с C.

0 голосов
/ 13 декабря 2010

Проблема «совместимости с C» подразумевается только в одном направлении: старый действительный C-код также должен компилироваться как код C ++.Обратный путь невозможен, как только используется любая языковая функция, которая есть только в C ++.

Это означает, что в C ++ вы всегда пишете классы, вы можете вообще не использовать ключевое слово struct;хотя некоторые, включая меня, думают, что они пригодятся, чтобы показать, что класс - это просто набор именованных значений, без реальной инкапсуляции или, возможно, сложного поведения.

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