Каковы различия между структурой и классом в C ++? - PullRequest
413 голосов
/ 18 сентября 2008

Этот вопрос уже задавался в контексте C # /. Net .

Теперь я хотел бы изучить различия между структурой и классом в C ++. Пожалуйста, обсудите технические различия, а также причины выбора того или иного в дизайне OO.

Начну с очевидной разницы:

  • Если вы не укажете public: или private:, члены структуры являются открытыми по умолчанию; по умолчанию члены класса являются закрытыми.

Я уверен, что есть и другие отличия в неясных углах спецификации C ++.

Ответы [ 29 ]

0 голосов
/ 04 августа 2011

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

0 голосов
/ 15 июля 2015

** ОБНОВЛЕНИЕ: ** Пожалуйста, игнорируйте этот ответ. Я не рассматривал возможность того, что для структуры значение было неинициализировано, а просто оказалось равным 0. Между инициализацией структуры и класса нет различий.


Я вижу другое различие между структурами и классами, связанное с инициализацией по умолчанию.

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();
}

Запустите этот код и проверьте myTester. Вы обнаружите, что для m_Foo структура m_Foo.a была инициализирована в 0, но для m_Bar класс m_Bar.a неинициализирован. Таким образом, кажется, есть разница в том, что конструктор по умолчанию делает для структуры против класса. Я вижу это в Visual Studio.

0 голосов
/ 01 мая 2015

Вы могли бы рассмотреть это для руководства о том, когда идти для структуры или класса, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx.

√ СЧИТАЙТЕ определение структуры вместо класса, если экземпляры типа являются маленькими и обычно недолговечными или обычно встраиваются в другие объекты.

X ИЗБЕГАЙТЕ определения структуры, если тип не имеет всех следующие характеристики:

Логически представляет одно значение, похож на примитивные типы (int, double и т. д.).

У него есть экземпляр размер до 16 байт.

Он неизменен.

Это не должно быть в штучной упаковке часто.

0 голосов
/ 16 марта 2015

Класс имеет смысл только в контексте разработки программного обеспечения. В контексте структур данных и алгоритмов класс и структура ничем не отличаются. Не существует каких-либо правил, ограничивающих ссылку на члена класса.

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

Если вы прочитаете некоторые принципы разработки программного обеспечения, вы обнаружите, что большинство стандартов не могут быть легко реализованы без занятий. например: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

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

0 голосов
/ 05 декабря 2014

Есть 3 основных различия между структурой и классом

1St- память зарезервирована для структуры в стековой памяти (которая близка к языку программирования), зарезервированы ли для класса в стековой памяти только ссылка и фактическая память зарезервирована в кучной памяти.

2Nd - по умолчанию структура считается общедоступной, а класс - частным.

3Rd - не может повторно использовать код в структуре, но в классе мы можем повторно использовать один и тот же код много раз, называемый наследованием

0 голосов
/ 28 января 2014

Основное различие между структурой и ключевым словом класса в oops заключается в том, что в структуре нет открытого и закрытого объявления члена, а элемент данных и функция-член могут быть определены как публичные, приватные и защищенные.

0 голосов
/ 25 сентября 2013

Классы являются ссылочными типами, а структуры - типами значений.
Когда я говорю, что классы являются ссылочными типами,
в основном они будут содержать адрес переменных экземпляра.

Например:

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.
}

В основном методе,
Я могу создать экземпляр этого класса, используя оператор new, который выделяет память для этого класса
и сохраняет базовый адрес этого в переменной типа MyClass (_myClassObject2).

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

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

В вышеуказанной программе MyClass _myClassObject2 = _myClassObject1; инструкция указывает, что обе переменные типа MyClass

  1. myClassObject1
  2. myClassObject2

и будет указывать на ту же ячейку памяти.
Он в основном назначает ту же ячейку памяти в другую переменную того же типа.

Так что, если какие-либо изменения, которые мы вносим в один из объектов типа MyClass, будут влиять на другой
поскольку оба указывают на одну и ту же ячейку памяти.

"_ myClassObject1.DataMember = 10;" в этой строке оба элемента данных объекта будут содержать значение 10.
"_myClassObject2.DataMember = 20;" в этой строке оба элемента данных объекта будут содержать значение 20.
В конце концов, мы получаем доступ к элементам данных объекта через указатели.

В отличие от классов, структуры являются типами значений. Например:

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;
}

В вышеуказанной программе
создание объекта типа MyStructure с помощью оператора new и
сохранение адреса в переменной _myStructObject типа MyStructure и
присваивание значения 10 элементу данных структуры с использованием "_myStructObject1.DataMember = 10".

В следующей строке
Я объявляю другую переменную _myStructObject2 типа MyStructure и присваиваю _myStructObject1 в нее.
Здесь компилятор .NET C # создает еще одну копию объекта _myStructureObject1 и
назначает эту ячейку памяти переменной MyStructure _myStructObject2.

Так что любое изменение, которое мы вносим в _myStructObject1, никогда не повлияет на другую переменную _myStructObject2 типа MyStructrue.
Вот почему мы говорим, что Структуры являются типами значений.

Таким образом, непосредственным базовым классом для класса является Object, а непосредственным базовым классом для Structure является ValueType, который наследуется от Object.
Классы будут поддерживать наследование, тогда как структуры не будут.

Как мы это говорим?
И в чем причина этого?
Ответ - Классы.

Он может быть абстрактным, запечатанным, статичным и частичным и не может быть частным, защищенным и защищенным внутри.

0 голосов
/ 27 августа 2013

Из всех этих факторов можно сделать вывод, что концепт-класс очень подходит для представления объектов реального мира, а не "структур". В основном потому, что концепции ООП, используемые в классе, очень практичны при объяснении сценариев реального мира, поэтому их легче объединить Например, наследование по умолчанию является общедоступным для структур, но если мы применяем это правило для реального мира, это смешно. Но в классе наследование по умолчанию является приватным, что более реалистично.

В любом случае, мне нужно обосновать, что класс - это гораздо более широкое понятие, применимое к реальному миру, тогда как структура - это примитивная концепция с плохой внутренней организацией (хотя структура следует за концепциями ООП, они имеют плохое значение)

0 голосов
/ 15 апреля 2013

Разница между struct и class ключевыми словами в C ++ заключается в том, что, когда нет определенного спецификатора для конкретного составного типа данных, тогда по умолчанию struct или union - это общедоступные ключевые слова, которые просто учитывают скрытие данных, а class - это закрытое ключевое слово, которое учитывает скрытие программных кодов или данных. Некоторые программисты всегда используют struct для данных и class для получения кода. Для получения дополнительной информации свяжитесь с другими источниками.

...